如何提高两个列表中的值相乘、检查匹配索引的性能

问题描述 投票:0回答:1

我创建了两个列表,将它们称为“a”和“b”。 列表 a 的长度为 24,480,而 b 的长度为 20,116。 a 和 b 中的每个元素也是长度为 3 的列表。为了可视化,这些列表的每个元素如下所示:

a = [str1a, str2a, float1a]
b = [str1b, str2b, float1b]

我需要做的是能够检查

str1a == str1b
str2a == str2b
是否存在,然后更改
float1a
的值,得到
float1a * float1b
。 列表
b
中有一些重复项,并非每个元素都一定有匹配项。

我使用循环尝试了这个,它可以工作并得到我需要的东西。

for i in range(0, len(a)):
    for n in range(0, len(b)):
        if a[i][0] == b[n][0] and a[i][1] == b[n][1]:
            a[i][2] *= b[n][2]

然而,我希望能够以(更快)更有效的方式获得相同的结果。 理想情况下,我坚持使用基于 python 的方法 - 我宁愿不通过导入任何模块来解决这个问题。

python list loops processing-efficiency
1个回答
0
投票

对于 listA 中的每个元素,您正在查找 listB 中的所有元素,然后检查 2 个索引处的值是否相同。如果是,则更新索引 3 值。使用这种方法你正在做 O(N*M)

您可以通过创建 2 个索引的唯一散列来减少查找,并将其中的所有索引作为值。当你遍历listB时,你将对前两个索引进行哈希,并查看该哈希是否存在于listA哈希的字典中。如果是,则对所有索引应用乘法逻辑

list1 = [['a', 'b',2], ['c', 'd', 3]]
list2 = [['a', 'b',3], ['a','b', 3]]

dic = {}
for index, (a,b, c) in enumerate(list1):
    key = a +'_' + b # assume a and b not have _, and _ is unique concateor 
    if key not in dic:
        dic[key] = []
    dic[key].append(index)

for index, (a, b, c) in enumerate(list2):
    key = a + '_' + b
    if key in dic:
        for index in dic[key]:
            list1[index][2] *= c

print(list1) # [['a', 'b', 18], ['c', 'd', 3]]

© www.soinside.com 2019 - 2024. All rights reserved.