【问题标题】:How to loop through two lists and work on the match?如何遍历两个列表并进行匹配?
【发布时间】:2021-07-24 00:59:02
【问题描述】:

我有两个列表。我希望能够使用 for 循环进行迭代,并希望根据匹配的元素对元素进行一些操作。我无法弄清楚这里出了什么问题,

lst1 = ["a1", "b1", "c1", "d1", "e1", "f1", "g1"] 
lst2 = ["c1", "d1", "e1"]

for l in lst1:
    for m in lst2:
        if l == m:
            v = l + "__match_found"
        else:
            v = l + "__no_match"
    print(v)

我得到以下输出:

a1__no_match
b1__no_match
c1__no_match
d1__no_match
e1__match_found
f1__no_match
g1__no_match

我希望每个元素应该只打印一次,或者以 match 结尾,或者以 no_match 结尾。

【问题讨论】:

  • 你的预期输出是什么?
  • 看看 Python 中的 for..else 循环。您可以在找到匹配项时执行 break 语句。如果没有遇到匹配(中断),则执行 else 子句以打印不匹配。

标签: python list loops


【解决方案1】:

由于您在外循环中打印v,您将获得分配给它的m 的最后一个值。这不是您想要的:您想在找到匹配项后立即将break 退出内部循环:

for l in lst1:
    v = l + "__no_match"
    for m in lst2:
        if l == m:
            v = l + "__match_found"
            break
    print(v)

现在让我们简化并使其更 Pythonic。首先,内部循环只是对包含的检查。在 python 中,这通常使用 in 运算符来完成:

for l in lst1:
    v = "__match_found" if l in lst2 else "__no_match"
    print(l + v)

现在,如果您的唯一目标是检查容器,那么使用set 比使用list 作为容器要好得多。例如:

s1 = set(lst1)
s2 = set(lst2)

for i in s1 & s2:
    print(i + '__match_found')
for i in s1 - s2:
    print(i + '__no_match')

这些操作是通过哈希完成的,并且比列表的线性查找要快得多。

【讨论】:

    【解决方案2】:

    在您的代码中,当 lc1 时,在您的内部循环的每次迭代中:

    • mc1: v = l + "__match_found"
    • md1: v = l + "__no_match"
    • me1: v = l + "__no_match"

    然后您只打印 v 的最终值。

    相反,当您找到匹配项时,您应该使用 break 来停止内部循环:

    for l in lst1:
        for m in lst2:
            if l == m:
                v = l + "__match_found"
                break
            else:
                v = l + "__no_match"        
        print(v)
    

    更简洁的方法是使用in

    for l in lst1:
        if l in lst2:
            print (l + "__match_found")
        else:
            print (l + "__no_match")
    

    【讨论】:

      猜你喜欢
      • 2010-12-12
      相关资源
      最近更新 更多