我只在两个字符串列表中找到现有重复项的一小部分

I only find a fraction of the existing duplicates in two Lists of Strings

此方法接收字符串列表作为参数,并且应该return 未检查的所有字符串,这些字符串在有效性中没有匹配项。 (字符串是电子邮件地址)

如果我输入两个完全相同的列表,会找到一些重复项,但不是全部。 如果我输入两个唯一列表,此行为是一致的。找到并删除了一些重复项,有些则没有。

我找到了类似问题的答案,但我找不到关于这个特定问题的信息。

我的方法:

def getUnmatchedAddresses(valids, uncheckeds):
    
    unmatcheds = uncheckeds

    for unchecked in uncheckeds:
        for valid in valids:
            if(unchecked == valid):
                unmatcheds.remove(valid)
                
    return unmatcheds

当您分配 unmatcheds = uncheckeds 时,您并没有创建列表的副本,只是为它创建了另一个名称,但它实际上是同一个列表。您需要创建列表的副本。

def getUnmatchedAddresses(valids, uncheckeds):
    
    unmatcheds = uncheckeds.copy()

    for unchecked in uncheckeds:
        for valid in valids:
            if(unchecked == valid):
                unmatcheds.remove(valid)
                
    return unmatcheds

问题来自 unmatcheds = uncheckeds 不执行深层复制:它只复制引用。结果,循环迭代导致您出现问题的变异列表。虽然您可以在迭代之前复制列表,但这显然 低效 。您可以使用以下代码直接有效地构建新的:

def getUnmatchedAddresses(valids, uncheckeds):
    return [unchecked for unchecked in uncheckeds 
               if not any(unchecked == valid for valid in valids)]

您也可以通过迭代有效列表来避免深层复制问题。这导致相同的结果,但避免删除正在迭代的列表的项目。注意:这会改变未检查列表。

这是一个 example/rework 测试和工作:

def getUnmatchedAddresses(valids, uncheckeds):
    
    for va in valids:
        while va in uncheckeds:
            uncheckeds.remove(va)

    return uncheckeds

示例:

v = [1, 2, 3, 4]
u = [1, 2, 3, 4]

print(getUnmatchedAddresses(v, u))

输出为:

[]