猿问

嵌套 for 循环遍历文本文件中的每个组合

下面是我的代码:


with open('test.txt') as f:

    for i in f:


        for j in f:


            pw_n= i+j

            print(pw_n)

test.txt 中的示例数据是:


USA

Canada

Mexico

China

Russia

当前输出:


USA

CANADA


USA

MEXICO


USA

China


USA

Russia

以上很棒,但我希望它经历所有迭代。所以,在完成美国之后,我希望它去加拿大,然后是墨西哥等......例如:


Canada

USA


Canada

Canada


Canada

Mexico

..........

任何有关这方面的帮助都会很棒。我试图将 'i' 增加 1,但这不起作用。


拉丁的传说
浏览 181回答 3
3回答

肥皂起泡泡

如果你想尽可能接近你当前的代码,你应该使用file.readlines():with open('test.txt') as f:    lines = f.readlines()    for i in lines:        for j in lines:            pw_n = i + j            print(pw_n)另外,我建议更改lines = f.readlines()为:lines = [x.rstrip('\n') + '\n' for x in f.readlines()]该列表理解将强制所有单词以 a 结尾'\n'(在您的文件Russia中没有任何'\n'结尾,因此它在输出中的显示方式不同,这解决了这个问题)。如果您正在寻找更好的代码,您应该使用itertools.permutations(iterable, r=None),r每个组合的项目数在哪里(在这种情况下,我们需要 2 个)from itertools import permutationswith open('test.txt') as f:    for x, y in permutations(f.readlines(), 2):        print(x + y)您还可以通过添加以下内容来改进此代码:for x, y in permutations((x.rstrip('\n') + '\n' for x in f.readlines()), 2):这里不需要列表理解,相反,我们可以使用生成器表达式,这对内存更友好。由于您在循环内迭代每个排列for,因此您无需将其存储为列表,这意味着您无需同时将所有排列存储在内存中,而是在您使用时计算它们他们。这同样适用于生成器表达式,您不会将它与第一个代码中的列表理解相反。

MYYA

这是一种解决方案with open('test.txt') as f:    lines = f.readlines()for i, val in enumerate(lines):    for j in range(i+1, len(lines)):        print("%s%s" %(val, lines[j]))    print("")

ITMISS

看看https://docs.python.org/3.4/library/itertools.html#itertools.permutations>>> list(permutations(['USA', 'Canada', 'Mexico'], 2)) [    ('USA', 'Canada'),     ('USA', 'Mexico'),     ('Canada', 'USA'),     ('Canada', 'Mexico'),     ('Mexico', 'USA'),     ('Mexico', 'Canada')]
随时随地看视频慕课网APP

相关分类

Python
我要回答