使用两个列表优化嵌套for循环

时间:2014-09-01 08:41:17

标签: python optimization python-3.x nested

我有一个搜索两个单独列表的程序,我们称之为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的开头重新开始,它应该足以从匹配的最后一点继续。但我不知道如何用代码编写它。

2 个答案:

答案 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

这可能会减少时间复杂度......