二维列表计算
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]
表示每个条目的 ID
和 abs(i[1] - j[1])
计算它们的绝对差异。在最终列表结果中作为元组添加(注意它们周围的括号)。
一般来说,如果您有大量数据,sorted
可能会 减慢您的速度,但这取决于数据与我的数据相比有多混乱知道的。
除此之外,zip
创建了一个迭代器,因此在内存方面它不会影响您。速度方面,列表组合往往非常有效,在大多数情况下是您的最佳选择。
我有两个二维列表。每个 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]
表示每个条目的 ID
和 abs(i[1] - j[1])
计算它们的绝对差异。在最终列表结果中作为元组添加(注意它们周围的括号)。
一般来说,如果您有大量数据,sorted
可能会 减慢您的速度,但这取决于数据与我的数据相比有多混乱知道的。
除此之外,zip
创建了一个迭代器,因此在内存方面它不会影响您。速度方面,列表组合往往非常有效,在大多数情况下是您的最佳选择。