二维列表计算

问题描述:

我有两个二维列表。每个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()这种种的地方),然后:

+0

工作很好。我需要将结果作为列表列表返回,Jims解决方案返回元组列表。谢谢! – Cellydy

+1

他的解决方案可以通过将'i [0],abs(i [1] - j [1])''放入'[]'而不是'()'来改变返回列表的列表。 – dashiell

您可以通过使用列表理解实现这一目标它通过将排序列表提供给zip来创建包含列表['ID_001', 1000], ['ID_001', 500]中的每个条目的元组。

最后:

(i[0], abs(i[1] - j[1])) 

回报i[0]表示ID每个条目和abs(i[1] - j[1])计算它们的绝对差。在最终列表结果中添加了一个元组(,注意围绕它们的括号)。


一般来说,sorted可能你慢下来,如果你有大量的数据,但依赖于数据如何混乱的是什么我知道。

除此之外,zip创建一个迭代器,因此内存明智,它不会影响你。速度明智,清单比较往往是相当有效的,并在大多数情况下是你最好的选择。