2

如何创建一个列表,其中包含一个元素在多个列表中出现的次数。例如我有这些列表:

list1 = ['apples','oranges','grape']
list2 = ['oranges, 'oranges', 'pear']
list3 = ['strawberries','bananas','apples']
list4 = [list1,list2,list3]

我想计算包含每个元素的文档数量并将其放入字典中,所以对于苹果^和橙子,我得到了这个:

term['apples'] = 2
term['oranges'] = 2   #not 3
4

3 回答 3

0

利用collections.Counter

from collections import Counter
terms = Counter( x for lst in list4 for x in lst )
terms
=> Counter({'oranges': 3, 'apples': 2, 'grape': 1, 'bananas': 1, 'pear': 1, 'strawberries': 1})
terms['apples']
=> 2

正如@Stuart 指出的那样,您还可以使用chain.from_iterable, 来避免生成器表达式中看起来很尴尬的双循环(即for lst in list4 for x in lst)。

编辑:另一个很酷的技巧是取Counters 的总和(受这个著名答案的启发),例如:

sum(( Counter(lst) for lst in list4 ), Counter())

于 2013-07-13T20:20:38.830 回答
0
print (list1 + list2 + list3).count('apples')

或者,如果您已经在 中编译了所有列表list4,则可以将itertools.chain它们用作链接它们的快速方法:

from itertools import chain
print list(chain.from_iterable(list4)).count('apples')

编辑:或者你可以不这样做itertools

print sum(list4, []).count('apples') 

collections.Counter如果出于某种原因您想复制,可以轻松复制...

all_lists = sum(list4, [])
print dict((k, all_lists.count(k)) for k in set(all_lists))
于 2013-07-13T20:23:32.170 回答
0
>>> [el for lst in [set(L) for L in list4] for el in lst].count('apples')
2
>>> [el for lst in [set(L) for L in list4] for el in lst].count('oranges')
2

如果您希望最终结构作为字典,则可以使用字典推导从展平的集合列表中创建直方图:

>>> list4sets = [set(L) for L in list4]
>>> list4flat = [el for lst in list4sets for el in lst]
>>> term = {el: list4flat.count(el) for el in list4flat}
>>> term['apples']
2
>>> term['oranges']
2
于 2013-07-13T20:26:15.323 回答