二维列表计算

时间:2016-08-02 13:47:45

标签: python list python-3.x multidimensional-array mapping

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

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

2 个答案:

答案 0 :(得分:2)

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。

答案 1 :(得分:2)

您可以使用列表理解

来实现这一目标
diff = [(i[0], abs(i[1] - j[1])) for i,j in zip(sorted(list1), sorted(list2))]

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

最后:

zip

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

一般情况下,如果您拥有大量数据,abs(i[1] - j[1]) 可能会降低您的速度,但这取决于我所知道的数据的混乱程度。

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