Python 使用嵌套for循环的组合

Python 使用嵌套for循环的组合,python,for-loop,combinations,Python,For Loop,Combinations,我的问题简化为: 我写了这段代码: string = ['A','A','A','A'] temp=string[:] f=open('combin.txt', 'a') for x1 in range(0,2): if x1==1: temp[0]='X' for x2 in range(0,2): if x2==1: temp[1]='X' for x3 in range(0,2):

我的问题简化为: 我写了这段代码:

string = ['A','A','A','A']
temp=string[:]

f=open('combin.txt', 'a')

for x1 in range(0,2):
    if x1==1:
        temp[0]='X'
    for x2 in range(0,2):
        if x2==1:
            temp[1]='X'
        for x3 in range(0,2):
            if x3==1:
                temp[2]='X'
            for x4 in range(0,2):
                if x4==0:
                    f.write(''.join(temp)+'\n')
                if x4==1:
                    temp[3]='X'
                    f.write(''.join(temp)+'\n')
结果是:

AAAA
AAAX
AAXX
AAXX
AXXX
AXXX
AXXX
AXXX
XXXX
XXXX
XXXX
XXXX
XXXX
XXXX
XXXX
XXXX
但我期望的是组合: AAAA AAAX 阿萨 阿克萨 沙阿 AAXX 阿克萨 沙克斯 XXAA XAXA 阿克萨 AXXX XAXX XXAX XXXA XXXX


请注意,在最终的程序中,我需要在每个if条件下执行许多操作,因此这将不是一个简单的字符串字符迭代,但首先我想让这个组合部分工作。非常感谢您的帮助。

您可以使用内置的库itertools,它具有“组合”功能,或者您可以认识到您实际上是在表达二进制数:

for s in [bin(n)[2:].zfill(4) for n in xrange(2 ** 4)]:
    print s.replace('0','A').replace('1','X')
上述代码:

  • 取值范围为0(0b0000)到2^4-1(0b1111)
  • 将每个转换为字符串中的二进制表示形式(内置bin函数)
  • 删除前导的“0b”
  • 确保生成的字符串有足够的前导零
  • 然后在for循环体中,将1和0转换为您的格式
  • 您所做的操作可以基于范围的数量,在这种情况下,您可以将字符串格式移动到循环体中(当然,如果您知道您将要做什么类型的操作,这会有所帮助)

    以下是一种不太直观的组合显示方式:

    def gen(s):
        if len(s) == 4:
            print s
            return 
        gen(s+'A')
        gen(s+'X')
    # which you would run with:
    gen('')
    

    您可以使用内置的itertools库,它具有“组合”功能,或者您可以认识到您本质上是在表达二进制数:

    for s in [bin(n)[2:].zfill(4) for n in xrange(2 ** 4)]:
        print s.replace('0','A').replace('1','X')
    
    上述代码:

  • 取值范围为0(0b0000)到2^4-1(0b1111)
  • 将每个转换为字符串中的二进制表示形式(内置bin函数)
  • 删除前导的“0b”
  • 确保生成的字符串有足够的前导零
  • 然后在for循环体中,将1和0转换为您的格式
  • 您所做的操作可以基于范围的数量,在这种情况下,您可以将字符串格式移动到循环体中(当然,如果您知道您将要做什么类型的操作,这会有所帮助)

    以下是一种不太直观的组合显示方式:

    def gen(s):
        if len(s) == 4:
            print s
            return 
        gen(s+'A')
        gen(s+'X')
    # which you would run with:
    gen('')
    

    如果您在实际程序中确实需要所有的
    for
    循环,您可以这样修复它:

    for x1 in range(0,2):
        if x1==0:
            temp[0]='A'
        if x1==1:
            temp[0]='X'
        for x2 in range(0,2):
            if x2==0:
                temp[1]='A'
            if x2==1:
                temp[1]='X'
            for x3 in range(0,2):
                if x3==0:
                    temp[2]='A'
                if x3==1:
                    temp[2]='X'
                for x4 in range(0,2):
                    if x4==0:
                        temp[3]='A'
                    if x4==1:
                        temp[3]='X'
                    print(''.join(temp))
    
    它给出以下输出:

    AAAA
    AAAX
    AAXA
    AAXX
    AXAA
    AXAX
    AXXA
    AXXX
    XAAA
    XAAX
    XAXA
    XAXX
    XXAA
    XXAX
    XXXA
    XXXX
    

    请注意,最后一个字母变化最快,因为它是由最内部的
    for
    循环设置的。

    如果您在实际程序中确实需要
    for
    循环的所有
    ,您可以这样修复它:

    for x1 in range(0,2):
        if x1==0:
            temp[0]='A'
        if x1==1:
            temp[0]='X'
        for x2 in range(0,2):
            if x2==0:
                temp[1]='A'
            if x2==1:
                temp[1]='X'
            for x3 in range(0,2):
                if x3==0:
                    temp[2]='A'
                if x3==1:
                    temp[2]='X'
                for x4 in range(0,2):
                    if x4==0:
                        temp[3]='A'
                    if x4==1:
                        temp[3]='X'
                    print(''.join(temp))
    
    它给出以下输出:

    AAAA
    AAAX
    AAXA
    AAXX
    AXAA
    AXAX
    AXXA
    AXXX
    XAAA
    XAAX
    XAXA
    XAXX
    XXAA
    XXAX
    XXXA
    XXXX
    

    请注意,最后一个字母变化最快,因为它是由最内部的
    循环设置的。

    代码的问题是,您将
    temp
    的项设置为
    X
    ,但从未将它们设置回
    A
    。请参阅moarningsun的答案,了解解决此问题的直接方法。但是,您可以将其缩短一整段时间:不必在
    范围(0,2)
    上循环,并将
    temp[0]
    设置为
    X
    a
    ,这取决于
    x1
    的值,您可以直接在字符串
    AX
    中的字符上循环,并相应地设置
    temp[0]

    for x1 in 'AX':
        temp[0] = x1
    
    你甚至可以把它做成一个大的:

    当然,正确的方法是使用模块。然而,请注意,您所寻找的实际上不是,而是


    因此,您可以在一行可读的代码中创建“组合”,然后迭代该列表,并在一个更干净的循环中执行任何需要执行的操作。

    代码的问题在于,您将
    temp
    的项设置为
    X
    ,但从不将它们设置回
    a
    。请参阅moarningsun的答案,了解解决此问题的直接方法。但是,您可以将其缩短一整段时间:不必在
    范围(0,2)
    上循环,并将
    temp[0]
    设置为
    X
    a
    ,这取决于
    x1
    的值,您可以直接在字符串
    AX
    中的字符上循环,并相应地设置
    temp[0]

    for x1 in 'AX':
        temp[0] = x1
    
    你甚至可以把它做成一个大的:

    当然,正确的方法是使用模块。然而,请注意,您所寻找的实际上不是,而是


    因此,您可以在一行可读的代码中创建“组合”,然后迭代该列表,并在更干净的循环中执行您需要执行的任何操作。

    ?提供更多的上下文将非常有用,因为它可能会影响您正在寻找的解决方案的类型for@limelights我看不出这个问题的答案如何适用对这个。虽然这可能是相关的,但对我来说似乎是另一个问题。我不能使用迭代。正如我所说,这是我问题的简化版本。在实际问题中,我处理的不是字符串,而是不同的操作组。不管怎样,莫尔宁森已经提供了我所需要的解决方案?提供更多的上下文是很有用的,因为它很可能会影响您正在寻找的解决方案的类型for@limelights我看不出这个问题的答案如何适用于这个问题。虽然这可能是相关的,但对我来说似乎是另一个问题。我不能使用迭代。正如我所说,这是我问题的简化版本。在实际问题中,我处理的不是字符串,而是不同的操作组。总之,Moarningsun提供了我需要的解决方案。对于两种有趣的方法+1。我还在试着让我的脑袋转过来!也许有必要解释一下它是如何工作的。您可以设置一个默认参数
    defgen(s=“”):
    这样它就可以像
    gen()
    那样简单地调用。好主意,编辑以包括如何实际运行它。。。应该注意的是,对于任何一种解决方案,您都可以通过将“4”替换为变量(在递归情况下,通过将该变量作为参数传递)来生成任意位数的结果,对于两个有趣的应用程序,可以使用+1