我有一个搜索两个单独列表的程序,我们称之为list1和list2。
我只想打印list1和list2具有匹配项的实例。问题是,并非两个列表中的所有项目都相互匹配,但第一,第三和第四项应该相同。
如果匹配,我希望将完整列表(包括不匹配的项目)附加到两个相应的列表中。
我写了以下代码:
for item in list1:
for item2 in list2:
if (item[0] and item[2:4])==(item[0] and item2[2:4]):
newlist1.append(item)
newlist2.append(item2)
break
这很有效,但效率很低。对于一些较大的文件,我查看它可能需要10秒以上才能完成匹配,理想情况下最好只有一半。
我想的是,每次运行代码时,它不应该从list2的开头重新开始,它应该足以从匹配的最后一点继续。但我不知道如何用代码编写它。
答案 0 :(得分:1)
您的情况(item[0] and item[2:4])==(item[0] and item2[2:4])
错误。
除了第二个item[0]
应该是item2[0]
之外,(item[0] and item[2:4])
的作用如下(类似于(item2[0] and item2[2:4])
):
item[0]
为0
,则会返回item[0]
本身,即0
item[0]
不是0
,则返回item[2:4]
然后将其与第二学期的结果进行比较。因此,[0,1,1,1]
将“等于”[0,2,2,2]
,[1,1,1,1]
将“等于”[2,1,1,1]
。
请尝试使用tuples
:
if (item[0], item[2:4]) == (item2[0], item2[2:4]):
或按照其他答案的建议使用operator.itemgetter
。
要加快两个列表中项目的成对匹配,请将第一个列表中的项目放入字典中,使用这些元组作为键,然后迭代其他列表并查找字典中的匹配项目。复杂性将是 O(n + m)而不是 O(n * m)( n 和 m 正在列表的长度)。
key = operator.itemgetter(0, 2, 3)
list1_dict = {}
for item in list1:
list1_dict.setdefault(key(item), []).append(item)
for item2 in list2:
for item in list1_dict.get(key(item2), []):
newlist1.append(item)
newlist2.append(item2)
答案 1 :(得分:0)
from operator import itemgetter
getter = itemgetter(0, 2, 3)
for item,item2 in zip(list1, list2):
if getter(item) == getter(item2):
newlist1.append(item)
newlist2.append(item2)
break
这可能会减少时间复杂度......