如何解决这个复杂的循环问题?

时间:2019-11-24 16:50:07

标签: python python-3.x

首先,对不起标题,但是我真的不知道如何将这个问题放在一行中,但是由于它是循环问题,所以我提到了同样的问题。我一直在试图弄清楚如何进行这项工作,但如果能够解决其他问题,一切都会徒劳。

我想先从文件中读取,然后以这种方式打印。 (我在解释时会使用+而不是单词concatenation

第一行我希望是input + myfile.txt第一行 + some_string,因为我们正在使用{我在代码中的{1}}中已在j""(此行基本上是所有内容)中添加了num(这没什么意思)

第二行我希望它是chars + input + 2的{​​{1}} + myfile.txt + 第一行

第三行,我希望它是2 + some_string + input <的第一行中的3 < / p>

(真正的问题在此之后开始)

现在从第四行开始,我也想迭代myfile.txt数组,这是对我造成问题的一个。

第四行,我希望它是3 + some_string(来自chars数组)的input + 第一行 + {{ 1}}(这一行基本上是将类似于第一行的所有内容连接在一起,但是使用myfile.txt中的ab

我希望它是chars + some_string + ab + chars + input第一行  + 2

第六行我希望是myfile.txt + 2 + ab的{​​{1}} + some_string + 第一行  + input

我希望它是3的第七行+ myfile.txt + 3 + ab

第一行

第八行我希望是some_string + input + myfile.txt的{​​{1}} + bc + 第一行  + some_string

我希望第九行是input + 2 + myfile.txt的{​​{1}} + 2 + 第一行  + bc

然后它将对整个char数组(some_stringinput3)继续执行操作,然后在第二行中执行完全相同的操作{of myfile.txt

面临的问题是3数组和bc数组不相等(不具有相同的索引),所以当我在some_string中进行迭代时,每当我修复一个时,它都会弄乱一切事情对我来说又是一团糟。我已尽我所能来解决此问题,但未能做到。如果我错过解释的任何事情,请告诉我。

cd

编辑:

有人指出,我也应该在这里显示预期的输出。

de

myfile.txt的内容

ef

4 个答案:

答案 0 :(得分:0)

您可以从itertools用python循环替换num,然后在其上调用next。

例如创建您的周期

import itertools
num=itertools.cycle(["","2","3"])

然后在循环内调用下一个而不是建立索引

next(num)

编辑: 问题编辑使其更加清晰。 您可以使用嵌套的for循环使其更简单。

for c in chars:
    for n in num:
       print(input + i.rstrip() + n + c + some_string)

答案 1 :(得分:0)

要理解您对问题的描述并不容易,但是我认为您正在尝试这样做:

  • 对于文件的每一行,
    • 对于空字符串,然后对于chars中的每个值,
      • 对于num的每个值,
        • 打印一些通过将这些东西连接在一起而形成的输出字符串。

由于存在三层重复,因此自然的解决方案是使用三个循环。如果在列表的开头放置一个空字符串,将简化chars上的循环:

num = ["", "2", "3"]

# added empty string here
chars = ["", "ab", "bc", "cd", "de", "ef"]

some_string = "some_string"

input_string = str(input("input that we would get"))

with open("myfile.txt", "r") as myfile:
    for file_line in myfile:
        file_line = file_line.rstrip()
        for c in chars:
            for n in num:
                print(input_string + n + file_line + n + c + some_string)

请注意,我已将您的input变量重命名,以避免覆盖内置的input函数。我还按值遍历了这些列表,这比按索引进行遍历更简单,更简洁。并且我已经将rstrip()移到了外部循环,因此每行只需要剥离一次。

如果您不希望有太多的嵌套循环,则可以使用itertools.product使用一个循环编写等效版本:

import itertools

num = ["", "2", "3"]
chars = ["", "ab", "bc", "cd", "de", "ef"]
some_string = "some_string"
input_string = str(input("input that we would get"))

with open("myfile.txt", "r") as myfile:
    myfile = ( s.rstrip() for s in myfile )
    for file_line, c, n in itertools.product(myfile, chars, num):
        print(input_string + n + file_line + n + c + some_string)

答案 2 :(得分:0)

此实现不使用数字索引:

num = ["", "2", "3"]
chars = ["", "ab", "bc", "cd", "de", "ef"]
num_chars_variations=[(n, c) for c in chars for n in num]
some_string = "some_string"
input = str(input("input that we would get"))
with open("24_st.txt", "r") as myfile:
    for line in myfile:
        for variation in num_chars_variations:
            n, c = variation
            n1 = n if c != "" else ""
            print(input + n + line.strip() + n1 + c + some_string)

答案 3 :(得分:-1)

这里要使用的工具是模运算符和整数除法运算符。也许是这样的:

print(input + i.rstrip() + num[j%3] + chars[j//3] + some_string)