[英]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.