我只在两个字符串列表中找到现有重复项的一小部分
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))
输出为:
[]
此方法接收字符串列表作为参数,并且应该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))
输出为:
[]