为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉丁的传说 2021-12-17 15:34:35
下面是我的代码:with open('test.txt') as f:    for i in f:        for j in f:            pw_n= i+j            print(pw_n)test.txt 中的示例数据是:USACanadaMexicoChinaRussia当前输出:USACANADAUSAMEXICOUSAChinaUSARussia以上很棒,但我希望它经历所有迭代。所以,在完成美国之后,我希望它去加拿大,然后是墨西哥等......例如:CanadaUSACanadaCanadaCanadaMexico..........任何有关这方面的帮助都会很棒。我试图将 'i' 增加 1,但这不起作用。
查看完整描述

3 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

如果你想尽可能接近你当前的代码,你应该使用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 permutations

with 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,因此您无需将其存储为列表,这意味着您无需同时将所有排列存储在内存中,而是在您使用时计算它们他们。这同样适用于生成器表达式,您不会将它与第一个代码中的列表理解相反。


查看完整回答
反对 回复 2021-12-17
?
MYYA

TA贡献1868条经验 获得超4个赞

这是一种解决方案


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("")


查看完整回答
反对 回复 2021-12-17
?
ITMISS

TA贡献1871条经验 获得超8个赞

看看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')

]


查看完整回答
反对 回复 2021-12-17
  • 3 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信