我有两个二维列表。每个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)
我很好奇,所以我跑了几次,把我的答案和吉姆的比较。他们似乎在同一时间跑步。但是,如果您愿意接受作为字典的输出,您可以将我的运行时缩短一半。
当然,如果这对你来说很重要的话,他的作品更像Python。
您可以通过使用列表理解来实现这一点:
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]))
返回指示每个条目的CCD_ 8的i[0]
,并且CCD_。在最终列表结果中添加了一个元组(请注意它们周围的括号)。
一般来说,如果您有大量数据,sorted
可能会减慢速度,但这取决于据我所知数据的无序程度。
除此之外,zip
创建了一个迭代器,这样在内存方面就不会影响您。就速度而言,列表编译往往非常高效,在大多数情况下是您的最佳选择。