2d列表计算



我有两个二维列表。每个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创建了一个迭代器,这样在内存方面就不会影响您。就速度而言,列表编译往往非常高效,在大多数情况下是您的最佳选择。

相关内容

  • 没有找到相关文章

最新更新