如何获取具有特定元素的列表数量?

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)

如果你喜欢函数式编程,你也可以喂chainset- mapPED listOfListsCounter:

>>> 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)

这与第一种方法完全等效(除了可能更快一些).


Jea*_*bre 9

我将每个列表转换为一组,然后计算传递给的生成器理解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)

(这几乎就是你所做的,但上面的代码会短路很多循环和临时列表创建)


zwe*_*wer 7

你也可以不用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)

不是最优雅,但应该快得多.


mir*_*ulo 5

可能看起来像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)