N_B*_*N_B 9 python list counting python-3.x
我有一个列表列表,看起来像
listOfLists = [
['a','b','c','d'],
['a','b'],
['a','c'],
['c','c','c','c']
]
Run Code Online (Sandbox Code Playgroud)
我想计算具有特定元素的列表的数量.例如,我的输出应该是
{'a':3,'b':2,'c':3,'d':1}
Run Code Online (Sandbox Code Playgroud)
如您所见,我不需要元素的总数.在这种情况下"c",尽管其总计数为5,但输出为3,因为它仅出现在3个列表中.
我正在使用计数器来获取计数.同样可以在下面看到.
line_count_tags = []
for lists in lists_of_lists:
s = set()
for element in lists:
s.add(t)
lines_count_tags.append(list(s))
count = Counter([count for counts in lines_count_tags for count in counts])
Run Code Online (Sandbox Code Playgroud)
所以,当我打印计数时,我明白了
{'a':3,'c':3,'b':2,'d':1}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更好的方法来实现我的目标.
MSe*_*ert 12
使用a Counter并将每个列表转换为集合.该set会从每个列表中删除任何重复,这样你就不能指望在同一列表重复值:
>>> from collections import Counter
>>> Counter(item for lst in listOfLists for item in set(lst))
Counter({'a': 3, 'b': 2, 'c': 3, 'd': 1})
Run Code Online (Sandbox Code Playgroud)
如果你喜欢函数式编程,你也可以喂chain的set- mapPED listOfLists到Counter:
>>> from collections import Counter
>>> from itertools import chain
>>> Counter(chain.from_iterable(map(set, listOfLists)))
Counter({'a': 3, 'b': 2, 'c': 3, 'd': 1})
Run Code Online (Sandbox Code Playgroud)
这与第一种方法完全等效(除了可能更快一些).
我将每个列表转换为一组,然后计算传递给的生成器理解Counter:
import collections
print(collections.Counter(y for x in listOfLists for y in set(x)))
Run Code Online (Sandbox Code Playgroud)
结果:
Counter({'a': 3, 'c': 3, 'b': 2, 'd': 1})
Run Code Online (Sandbox Code Playgroud)
(这几乎就是你所做的,但上面的代码会短路很多循环和临时列表创建)
你也可以不用a来做Counter:
result = {}
for lis in listOfLists:
for element in set(lis):
result[element] = result.get(element, 0) + 1
print result # {'a': 3, 'c': 3, 'b': 2, 'd': 1}
Run Code Online (Sandbox Code Playgroud)
不是最优雅,但应该快得多.
可能看起来像Counter方法上的一些风格差异itertools.chain.from_iterable
Counter(chain.from_iterable(map(set, listOfLists)))
Run Code Online (Sandbox Code Playgroud)
演示
>>> from itertools import chain
>>> from collections import Counter
>>> Counter(chain.from_iterable(map(set, listOfLists)))
Counter({'a': 3, 'b': 2, 'c': 3, 'd': 1})
Run Code Online (Sandbox Code Playgroud)
粗略的基准
%timeit Counter(item for lst in listOfLists for item in set(lst))
100000 loops, best of 3: 13.5 µs per loop
%timeit Counter(chain.from_iterable(map(set, listOfLists)))
100000 loops, best of 3: 12.4 µs per loop
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1148 次 |
| 最近记录: |