将两个列表与相似元素组合在一起

时间:2015-04-16 02:51:06

标签: python list collections counter

我有多个列表,每个列表都包含单词,而一个数字表示单词在文章中出现的次数。我想将这些列表组合在一起,将独特的单词分开并添加相同单词的计数。例如:

list_one = [(u'he':3),(u'she':2),(u'it':1),(u'pineapple':1)]
list_two = [(u'he':4),(u'she':1),(u'it':0)]

然后通过组合list_one和list_two返回list_three

list_three = [(u'he':7),(u'she':3),(u'it':1),(u'pineapple':1)]

我使用collections.Counter从文章获得了列表,并尝试使用Counter.update将两者一起添加。我想保留订单,这意味着在列表前面保留最多的计数。任何帮助都会很棒。

瑞士

2 个答案:

答案 0 :(得分:1)

Python计数器实际上可以求和! - http://ideone.com/spJMsx

  

提供了几个数学运算来组合Counter对象以生成多个集合(计数大于零的计数器)。加法和减法通过加或减相应元素的计数来组合计数器。

     

From the Python documentation

所以这个:

from collections import Counter
list1 = Counter(['eggs','spam','spam','eggs','sausage','and spam'])
list2 = Counter(['spam','bacon','spam','eggs','sausage','and spam'])

print list1
print list2
print list1+list2

输出:

Counter({'eggs': 2, 'spam': 2, 'sausage': 1, 'and spam': 1})
Counter({'spam': 2, 'eggs': 1, 'bacon': 1, 'sausage': 1, 'and spam': 1})
Counter({'spam': 4, 'eggs': 3, 'sausage': 2, 'and spam': 2, 'bacon': 1})

答案 1 :(得分:1)

让我们从你的两个列表开始,略微适应Python:

list_one = [(u'he', 3),(u'she', 2),(u'it', 1),(u'pineapple', 1)]
list_two = [(u'he', 4),(u'she', 1),(u'it',0)]

现在,让我们将它们结合起来:

d = {word:value for word, value in list_one}
for word, value in list_two:
    d[word] = d.get(word, 0) + value
print(d)

这会以字典形式产生所需的数字:

{u'it': 1, u'pineapple': 1, u'she': 3, u'he': 7}

以上是字典。如果您想要它返回元组表单列表,只需使用list(d.items())

[(u'it', 1), (u'pineapple', 1), (u'she', 3), (u'he', 7)]