二维列表计算
问题描述:
我有两个二维列表。每个list
项目包含一个带有字符串ID和整数的list
。我想从字符串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的整数。
我也想这样做是有效的,因为这两个列表将有成千上万的记录。
答
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)
我很好奇,所以我跑了几个时间比较我的答案吉姆。他们似乎在同一时间运行。但是,如果您愿意接受输出为字典,则可以将我的运行时间减半。
当然,如果这对你很重要,他当然会变得更加嗜好。
diff = [(i[0], abs(i[1] - j[1])) for i,j in zip(sorted(list1), sorted(list2))]
这第一分拣与sorted
名单,以便顺序是相似的(不与list.sort()
这种种的地方),然后:
答
您可以通过使用列表理解实现这一目标它通过将排序列表提供给zip
来创建包含列表['ID_001', 1000], ['ID_001', 500]
中的每个条目的元组。
最后:
(i[0], abs(i[1] - j[1]))
回报i[0]
表示ID
每个条目和abs(i[1] - j[1])
计算它们的绝对差。在最终列表结果中添加了一个元组(,注意围绕它们的括号)。
一般来说,sorted
可能你慢下来,如果你有大量的数据,但依赖于数据如何混乱的是什么我知道。
除此之外,zip
创建一个迭代器,因此内存明智,它不会影响你。速度明智,清单比较往往是相当有效的,并在大多数情况下是你最好的选择。
工作很好。我需要将结果作为列表列表返回,Jims解决方案返回元组列表。谢谢! – Cellydy
他的解决方案可以通过将'i [0],abs(i [1] - j [1])''放入'[]'而不是'()'来改变返回列表的列表。 – dashiell