在列表列表中查找重复项

新手上路,请多包涵

我正在使用 Python 2.7 并尝试删除列表列表的重复项并合并重复项的值。

现在我有:

 original_list = [['a', 1], ['b', 1], ['a', 1], ['b', 1], ['b', 2], ['c', 2], ['b', 3]]

我想匹配每个嵌套列表的第一个元素,然后添加第二个元素的值。我想以此结束(最终列表的顺序无关紧要):

 ideal_output = [['a', 2], ['b', 7], ['c', 2]]

到目前为止,我有一些代码可以根据每个嵌套列表的第一个元素找到重复值:

 for item in original_list:
    matches = -1
    for x in original_list:
        if (item[0] == x[0]):
            matches += 1
    if matches >= 1:
        if item[0] not in duplicates_list:
            duplicates_list.append(item[0])

从这里我需要搜索 original_list 中的所有 duplicates_list 项目并将值相加,但我不确定最好的方法是什么。

原文由 e h 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 356
2 个回答

很多好的答案,但他们都使用了比我为此更多的代码,所以这是我的看法,因为它的价值:

 totals = {}
for k,v in original_list:
  totals[k] = totals.get(k,0) + v

# totals = {'a': 2, 'c': 2, 'b': 7}

一旦你有了这样的字典,从这些答案中的任何一个,你可以使用 items 来获得一个(n object that acts like a)元组列表:

 totals.items()
# => dict_items([('a', 2), ('c', 2), ('b', 7)])

并在元组中运行 list 以获得列表列表:

 [list(t) for t in totals.items()]
# => [['a', 2], ['c', 2], ['b', 7]]

如果你想让它们按顺序排序:

 sorted([list(t) for t in totals.items()])
# => [['a', 2], ['b', 7], ['c', 2]]


原文由 Mark Reed 发布,翻译遵循 CC BY-SA 4.0 许可协议

>>> from collections import Counter
>>> lst = [['a', 1], ['b', 1], ['a', 1], ['b', 1], ['b', 2], ['c', 2], ['b', 3]]
>>> c = Counter(x for x, c in lst for _ in xrange(c))

Counter({'b': 7, 'a': 2, 'c': 2})

>>> map(list, c.iteritems())
[['a', 2], ['c', 2], ['b', 7]]

或者,不重复每个项目 (a, b) b 次(@hcwhsa):

 >>> from collections import Counter
>>> lst = [['a', 1], ['b', 1], ['a', 1], ['b', 1], ['b', 2], ['c', 2], ['b', 3]]
>>> c = sum((Counter(**{k:v}) for k, v in lst), Counter())

Counter({'b': 7, 'a': 2, 'c': 2})

>>> map(list, c.iteritems())
[['a', 2], ['c', 2], ['b', 7]]

原文由 Maciej Gol 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题