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

2024-09-28 01:30:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个程序,搜索两个单独的列表,让我们称之为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中的开始重新开始,只要从最后一个匹配点开始就足够了。但我不知道怎么用代码写。你知道吗


Tags: and实例代码in程序列表forif
2条回答

你的条件(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)nm是列表的长度)。你知道吗

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)
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

这可能会减少一点时间复杂度,虽然。。。你知道吗

相关问题 更多 >

    热门问题