我有两个二维列表。每个list
项都包含一个list
,其中包含字符串ID和整数。我想从字符串ID匹配的地方减去彼此的整数。
清单1:
list1 = [['ID_001',1000],['ID_002',2000],['ID_003',3000]]
清单2:
list2 = [['ID_001',500],['ID_003',1000],['ID_002',1000]]
我想以
结束difference = [['ID_001',500],['ID_002',1000],['ID_003',2000]]
请注意,两个列表中的元素的顺序不一定相同。两个列表的长度相同,并且两个列表中的每个ID都有一个整数。
我还希望有效地完成这项工作,因为两个列表都有数千条记录。
答案 0 :(得分:2)
from collections import defaultdict
diffs = defaultdict(int)
list1 = [['ID_001',1000],['ID_002',2000],['ID_003',3000]]
list2 = [['ID_001',500],['ID_003',1000],['ID_002',1000]]
for pair in list1:
diffs[pair[0]] = pair[1]
for pair in list2:
diffs[pair[0]] -= pair[1]
differences = [[k,abs(v)] for k,v in diffs.items()]
print(differences)
我很好奇所以我跑了一些时间来比较我对Jim的回答。它们似乎几乎在同一时间运行。但是,如果您愿意接受输出作为字典,则可以将我的运行时间减半。
当然,如果这对你很重要,那么他就更像是Pythonic。
答案 1 :(得分:2)
您可以使用列表理解:
来实现这一目标diff = [(i[0], abs(i[1] - j[1])) for i,j in zip(sorted(list1), sorted(list2))]
首先使用sorted
对列表进行排序,以使顺序相似(而不是使用list.sort()
进行排序)然后,它会创建包含列表中{{1}的每个条目的元组通过将排序后的列表提供给['ID_001', 1000], ['ID_001', 500]
。
最后:
zip
返回(i[0], abs(i[1] - j[1]))
,表示每个条目i[0]
,ID
计算其绝对差异。在最终列表结果中添加了一个元组(注意它们周围的括号)。
一般情况下,如果您拥有大量数据,abs(i[1] - j[1])
可能会降低您的速度,但这取决于我所知道的数据的混乱程度。
除此之外,sorted
创建一个迭代器,因此在内存方面它不会影响你。速度方面,列表组合往往非常有效,在大多数情况下是最佳选择。