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')
上述代码:
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')
上述代码:
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