二维列表计算

2d-list calculations

我有两个二维列表。每个 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 对应一个整数。

我也希望能高效地完成这项工作,因为这两个列表都有数千条记录。

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,如果这对你很重要的话。

您可以通过使用列表理解来实现此目的:

diff = [(i[0], abs(i[1] - j[1])) for i,j in zip(sorted(list1), sorted(list2))]

这首先使用 sorted 对列表进行排序以使顺序相似(而不是使用 list.sort() 进行排序)然后,它创建包含列表中每个条目的元组 ['ID_001', 1000], ['ID_001', 500] 通过将排序后的列表提供给 zip.

最后:

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

returns i[0] 表示每个条目的 IDabs(i[1] - j[1]) 计算它们的绝对差异。在最终列表结果中作为元组添加(注意它们周围的括号)。


一般来说,如果您有大量数据,sorted 可能会 减慢您的速度,但这取决于数据与我的数据相比有多混乱知道的。

除此之外,zip 创建了一个迭代器,因此在内存方面它不会影响您。速度方面,列表组合往往非常有效,在大多数情况下是您的最佳选择。