我创建了两个列表,将它们称为“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 的方法 - 我宁愿不通过导入任何模块来解决这个问题。
对于 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]]