繁体   English   中英

我需要从列表中删除重复项,但要在其中添加数值

[英]I need to remove duplicates from a list but add the numeric value in them

我有一个看起来像这样的列表:

[('A54', 'ItemName1 ', '18'), ('B52', 'ItemName2 ', '51'), ('C45', 'ItemName3 ', '3'), ('A54', ' ItemName1', '15'), ('G22', ' ItemName5, '78')]

每个列表中的第一个项目代表一个项目编号,第二个项目代表项目名称,第三个项目是数量。

从列表中删除重复的实例,同时向它们添加项目总数的最佳方法是什么?

我尝试使用list()按字母顺序对列表进行排序,但是由于某些原因,它不起作用。

我的排序尝试如下所示:

L = [('A54', 'ItemName1 ', '18'), ('B52', 'ItemName2 ', '51'), ('C45', 'ItemName3 ', '3'), ('A54', ' ItemName1', '15'), ('G22', ' ItemName5', '78')]
L.sort()

print (L)

结果始终为None

您可能正在执行L = L.sort() ...,这说明了None结果(经典问题为什么“ return list.sort()”返回None,而不是list?

无论如何,排序+分组(例如,通过使用itertools.groupby )不是最佳方法。 不好的复杂度: O(n*log(n)) + O(n)

而是创建一个collections.defaultdict并对项目进行“计数”( collections.Counter在这里不起作用,因为count取决于转换为整数的第三个参数的值)。

然后通过解开字典键和值来重建三胞胎。

import collections

L = [('A54', 'ItemName1', '18'), ('B52', 'ItemName2', '51'),('C45', 'ItemName3', '3'),('A54', 'ItemName1', '15'), ('G22', 'ItemName5', '78')]

d = collections.defaultdict(int)
for a,b,c in L:
    d[a,b] += int(c)

newlist = [(a,b,c) for (a,b),c in d.items()]

结果:

>>> newlist
[('B52', 'ItemName2', 51),
 ('C45', 'ItemName3', 3),
 ('A54', 'ItemName1', 33),
 ('G22', 'ItemName5', 78)]
>>> 

那么复杂度为O(n)

请注意,您的原始数据似乎包含尾随/前导空格。 创建新字典时剥离它们不是问题(否则无法分组),例如:

d[a,b.strip()] += int(c)

我认为实现字典可能是一个好主意,因为您似乎将每个元组的第一项都作为键。 我个人会这样排序

from collections import OrderedDict

L = [('A54', 'ItemName1 ', '18'), ('B52', 'ItemName2 ', '51'), ('C45', 'ItemName3 ', '3'), ('A54', ' ItemName1', '15'), ('G22', ' ItemName5', '78')]

sorted_L = OrderedDict()
for item in L:
    if item[0] in sorted_L.keys():
        sorted_L[item[0]] += int(item[2])
    else:
        sorted_L[item[0]] = int(item[2])

print(sorted_L)

导致

OrderedDict([[('A54',33),('B52',51),('C45',3),('G22',78)])

但是通过使用OrderedDict而不是普通的字典来维护列表的顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM