嵌套 for 循环 Python 未按预期工作
Nested for loop Python not working as expected
我试图通过打开两个 txt 文件来读取它们,然后我想查找是否有任何行匹配(它们不需要按正确的顺序排列)。
例如:
txt 文件 1:
1
2
8
4
3
9
txt 文件 2:
2
0
10
9
8
所以 2、9 和 8 在这里是匹配项。
下面是我到目前为止尝试过的代码,但目前这两个 txt 文件中没有输出结果。它目前没有输出任何东西,这表明它正沿着 else
路径前进。
with open('file1.txt') as file1, open('file2.txt') as file2:
for domain in file2:
for domain_2 in file1:
if domain == domain_2:
print(domain + "Match found")
else:
continue
最简单的方法是将这些数字列表转换为集合,然后取它们的交集。这就是 set()
诞生的目的:-)。
假设您已经可以将文件内容读入列表,那么解决方案变为:
file1_data = ["2", "8", "4", "3", "9"]
file2_data = ["2", "0", "10", "9", "8"]
print(list(set(file1_data).intersection(file2_data)))
给我们:
['2', '8', '9']
如果您想根据与您现在所拥有的策略类似的策略进行更手动的方法,我会:
file1_data = ["2", "8", "4", "3", "9"]
file2_data = ["2", "0", "10", "9", "8"]
results = []
for value_1 in file1_data:
if value_1 in file2_data:
results.append(value_1)
print(results)
或者您可以使用列表理解:
results = [value_1 for value_1 in file1_data if value_1 in file2_data]
print(results)
最后两个版本中的关键部分是测试当前值 (value_1) 是否在您的第二个列表中通过:
value_1 in file2_data
如果问题的一部分与无法从 file1
中“重新读取”有关,那是因为在通过其生成器到达 file1
的末尾后,您将拥有重新阅读以回到开头。
出于这个原因,我建议将文件中的数据读取到没有此生成器限制的列表中。
with open("file1.txt", "r") as file1:
file1_data = [n.strip() for n in file1]
with open("file2.txt", "r") as file2:
file2_data = [n.strip() for n in file2]
虽然我不喜欢它,但您也可以这样做,这与您当前的解决方案非常接近:
with open('file1.txt') as file1:
with open('file2.txt') as file2:
for domain_2 in file2:
file1.seek(0)
for domain_1 in file1:
if domain_1.strip() == domain_2.strip():
print(f"Match Found: {domain_1.strip()}")
else:
continue
这给了我们:
Match Found: 2
Match Found: 9
Match Found: 8
请注意,与您当前解决方案的偏差主要是添加 file1.seek(0)
以将 file1 重置回起点,并包含各种 .strip()
以摆脱回车 returns 在原始数据中。另请注意,else: continue
在技术上是多余的,可以省略。
我试图通过打开两个 txt 文件来读取它们,然后我想查找是否有任何行匹配(它们不需要按正确的顺序排列)。
例如:
txt 文件 1:
1
2
8
4
3
9
txt 文件 2:
2
0
10
9
8
所以 2、9 和 8 在这里是匹配项。
下面是我到目前为止尝试过的代码,但目前这两个 txt 文件中没有输出结果。它目前没有输出任何东西,这表明它正沿着 else
路径前进。
with open('file1.txt') as file1, open('file2.txt') as file2:
for domain in file2:
for domain_2 in file1:
if domain == domain_2:
print(domain + "Match found")
else:
continue
最简单的方法是将这些数字列表转换为集合,然后取它们的交集。这就是 set()
诞生的目的:-)。
假设您已经可以将文件内容读入列表,那么解决方案变为:
file1_data = ["2", "8", "4", "3", "9"]
file2_data = ["2", "0", "10", "9", "8"]
print(list(set(file1_data).intersection(file2_data)))
给我们:
['2', '8', '9']
如果您想根据与您现在所拥有的策略类似的策略进行更手动的方法,我会:
file1_data = ["2", "8", "4", "3", "9"]
file2_data = ["2", "0", "10", "9", "8"]
results = []
for value_1 in file1_data:
if value_1 in file2_data:
results.append(value_1)
print(results)
或者您可以使用列表理解:
results = [value_1 for value_1 in file1_data if value_1 in file2_data]
print(results)
最后两个版本中的关键部分是测试当前值 (value_1) 是否在您的第二个列表中通过:
value_1 in file2_data
如果问题的一部分与无法从 file1
中“重新读取”有关,那是因为在通过其生成器到达 file1
的末尾后,您将拥有重新阅读以回到开头。
出于这个原因,我建议将文件中的数据读取到没有此生成器限制的列表中。
with open("file1.txt", "r") as file1:
file1_data = [n.strip() for n in file1]
with open("file2.txt", "r") as file2:
file2_data = [n.strip() for n in file2]
虽然我不喜欢它,但您也可以这样做,这与您当前的解决方案非常接近:
with open('file1.txt') as file1:
with open('file2.txt') as file2:
for domain_2 in file2:
file1.seek(0)
for domain_1 in file1:
if domain_1.strip() == domain_2.strip():
print(f"Match Found: {domain_1.strip()}")
else:
continue
这给了我们:
Match Found: 2
Match Found: 9
Match Found: 8
请注意,与您当前解决方案的偏差主要是添加 file1.seek(0)
以将 file1 重置回起点,并包含各种 .strip()
以摆脱回车 returns 在原始数据中。另请注意,else: continue
在技术上是多余的,可以省略。