Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python简化条件表达式_Python_Conditional Statements - Fatal编程技术网

Python简化条件表达式

Python简化条件表达式,python,conditional-statements,Python,Conditional Statements,我有9个变量a,b,c,d,e,f,g,h,I,我在9中循环它们,从0到9。但范围可能会有所不同 我希望它们的所有序列都是abcdefghi,这样就没有重复的数字了 现在我有这个,如下: for a in range(0, 9): for b in range(0,9): #it doesn't have to start from 0 .... for i in range(0, 9): if a != b and a != c ..

我有9个变量a,b,c,d,e,f,g,h,I,我在9中循环它们,从0到9。但范围可能会有所不同

我希望它们的所有序列都是abcdefghi,这样就没有重复的数字了

现在我有这个,如下:

for a in range(0, 9): 
    for b in range(0,9): #it doesn't have to start from 0
    ....
        for i in range(0, 9):
             if a != b and a != c ... a != i
                b != c and b != d ... b != i
                c != d and c != e ... c != i
                ... h != i:

                print (a,b,c,d,e,f,g,h,i)
有9个!=其中362880人

但是我如何减少条件表达式呢?如果for循环的范围不同呢


提前谢谢

您只需使用
itertools
模块即可:

from itertools import permutations

for arrangement in permutations('abcdefghi', 9):
    print ''.join(arrangement)

只需使用
itertools
模块即可:

from itertools import permutations

for arrangement in permutations('abcdefghi', 9):
    print ''.join(arrangement)

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 9 8
1 2 3 4 5 6 8 7 9
1 2 3 4 5 6 8 9 7
1 2 3 4 5 6 9 7 8
1 2 3 4 5 6 9 8 7

# ... etc - 9! = 362880 permutations
5 6 7 1 8 2 9 3 4
5 6 7 1 9 2 8 3 4
5 6 8 1 7 2 9 3 4
5 6 8 1 9 2 7 3 4
5 6 9 1 7 2 8 3 4
5 6 9 1 8 2 7 3 4
5 7 6 1 8 2 9 3 4
5 7 6 1 9 2 8 3 4
5 7 8 1 6 2 9 3 4
5 7 8 1 9 2 6 3 4

# ... etc - 5! * 5! = 14400 permutations
9 8 7 4 6 3 5 2 1
9 8 7 4 5 3 6 2 1
9 8 6 4 7 3 5 2 1
9 8 6 4 5 3 7 2 1
9 8 5 4 6 3 7 2 1
9 8 5 4 7 3 6 2 1
9 7 8 4 5 3 6 2 1
9 7 8 4 6 3 5 2 1
9 7 6 4 8 3 5 2 1
9 7 6 4 5 3 8 2 1
9 7 5 4 6 3 8 2 1

# ... etc - 14400 solutions

如果我想让a,b,c,e,g的值在0到9之间,d,f,h,i的值在1到5之间,那该怎么办

这有点复杂,但仍然可以实现。首先在
d..i
中选择值更容易:

from itertools import permutations

for d,f,h,i,unused in permutations([1,2,3,4,5], 5):
    for a,b,c,e,g in permutations([unused,6,7,8,9], 5):
        print(a,b,c,d,e,f,g,h,i)

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 9 8
1 2 3 4 5 6 8 7 9
1 2 3 4 5 6 8 9 7
1 2 3 4 5 6 9 7 8
1 2 3 4 5 6 9 8 7

# ... etc - 9! = 362880 permutations
5 6 7 1 8 2 9 3 4
5 6 7 1 9 2 8 3 4
5 6 8 1 7 2 9 3 4
5 6 8 1 9 2 7 3 4
5 6 9 1 7 2 8 3 4
5 6 9 1 8 2 7 3 4
5 7 6 1 8 2 9 3 4
5 7 6 1 9 2 8 3 4
5 7 8 1 6 2 9 3 4
5 7 8 1 9 2 6 3 4

# ... etc - 5! * 5! = 14400 permutations
9 8 7 4 6 3 5 2 1
9 8 7 4 5 3 6 2 1
9 8 6 4 7 3 5 2 1
9 8 6 4 5 3 7 2 1
9 8 5 4 6 3 7 2 1
9 8 5 4 7 3 6 2 1
9 7 8 4 5 3 6 2 1
9 7 8 4 6 3 5 2 1
9 7 6 4 8 3 5 2 1
9 7 6 4 5 3 8 2 1
9 7 5 4 6 3 8 2 1

# ... etc - 14400 solutions

对于一般情况(即数独),您需要一个更一般的解决方案-一个类似约束解算器的解决方案(参见简介)

然后,您的解决方案开始看起来像

from constraint import Problem, AllDifferentConstraint

p = Problem()
p.addVariables("abceg", list(range(1,10)))
p.addVariables("dfhi",  list(range(1, 6)))
p.addConstraint(AllDifferentConstraint())

for sol in p.getSolutionIter():
    print("{a} {b} {c} {d} {e} {f} {g} {h} {i}".format(**sol))

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 9 8
1 2 3 4 5 6 8 7 9
1 2 3 4 5 6 8 9 7
1 2 3 4 5 6 9 7 8
1 2 3 4 5 6 9 8 7

# ... etc - 9! = 362880 permutations
5 6 7 1 8 2 9 3 4
5 6 7 1 9 2 8 3 4
5 6 8 1 7 2 9 3 4
5 6 8 1 9 2 7 3 4
5 6 9 1 7 2 8 3 4
5 6 9 1 8 2 7 3 4
5 7 6 1 8 2 9 3 4
5 7 6 1 9 2 8 3 4
5 7 8 1 6 2 9 3 4
5 7 8 1 9 2 6 3 4

# ... etc - 5! * 5! = 14400 permutations
9 8 7 4 6 3 5 2 1
9 8 7 4 5 3 6 2 1
9 8 6 4 7 3 5 2 1
9 8 6 4 5 3 7 2 1
9 8 5 4 6 3 7 2 1
9 8 5 4 7 3 6 2 1
9 7 8 4 5 3 6 2 1
9 7 8 4 6 3 5 2 1
9 7 6 4 8 3 5 2 1
9 7 6 4 5 3 8 2 1
9 7 5 4 6 3 8 2 1

# ... etc - 14400 solutions

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 9 8
1 2 3 4 5 6 8 7 9
1 2 3 4 5 6 8 9 7
1 2 3 4 5 6 9 7 8
1 2 3 4 5 6 9 8 7

# ... etc - 9! = 362880 permutations
5 6 7 1 8 2 9 3 4
5 6 7 1 9 2 8 3 4
5 6 8 1 7 2 9 3 4
5 6 8 1 9 2 7 3 4
5 6 9 1 7 2 8 3 4
5 6 9 1 8 2 7 3 4
5 7 6 1 8 2 9 3 4
5 7 6 1 9 2 8 3 4
5 7 8 1 6 2 9 3 4
5 7 8 1 9 2 6 3 4

# ... etc - 5! * 5! = 14400 permutations
9 8 7 4 6 3 5 2 1
9 8 7 4 5 3 6 2 1
9 8 6 4 7 3 5 2 1
9 8 6 4 5 3 7 2 1
9 8 5 4 6 3 7 2 1
9 8 5 4 7 3 6 2 1
9 7 8 4 5 3 6 2 1
9 7 8 4 6 3 5 2 1
9 7 6 4 8 3 5 2 1
9 7 6 4 5 3 8 2 1
9 7 5 4 6 3 8 2 1

# ... etc - 14400 solutions

如果我想让a,b,c,e,g的值在0到9之间,d,f,h,i的值在1到5之间,那该怎么办

这有点复杂,但仍然可以实现。首先在
d..i
中选择值更容易:

from itertools import permutations

for d,f,h,i,unused in permutations([1,2,3,4,5], 5):
    for a,b,c,e,g in permutations([unused,6,7,8,9], 5):
        print(a,b,c,d,e,f,g,h,i)

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 9 8
1 2 3 4 5 6 8 7 9
1 2 3 4 5 6 8 9 7
1 2 3 4 5 6 9 7 8
1 2 3 4 5 6 9 8 7

# ... etc - 9! = 362880 permutations
5 6 7 1 8 2 9 3 4
5 6 7 1 9 2 8 3 4
5 6 8 1 7 2 9 3 4
5 6 8 1 9 2 7 3 4
5 6 9 1 7 2 8 3 4
5 6 9 1 8 2 7 3 4
5 7 6 1 8 2 9 3 4
5 7 6 1 9 2 8 3 4
5 7 8 1 6 2 9 3 4
5 7 8 1 9 2 6 3 4

# ... etc - 5! * 5! = 14400 permutations
9 8 7 4 6 3 5 2 1
9 8 7 4 5 3 6 2 1
9 8 6 4 7 3 5 2 1
9 8 6 4 5 3 7 2 1
9 8 5 4 6 3 7 2 1
9 8 5 4 7 3 6 2 1
9 7 8 4 5 3 6 2 1
9 7 8 4 6 3 5 2 1
9 7 6 4 8 3 5 2 1
9 7 6 4 5 3 8 2 1
9 7 5 4 6 3 8 2 1

# ... etc - 14400 solutions

对于一般情况(即数独),您需要一个更一般的解决方案-一个类似约束解算器的解决方案(参见简介)

然后,您的解决方案开始看起来像

from constraint import Problem, AllDifferentConstraint

p = Problem()
p.addVariables("abceg", list(range(1,10)))
p.addVariables("dfhi",  list(range(1, 6)))
p.addConstraint(AllDifferentConstraint())

for sol in p.getSolutionIter():
    print("{a} {b} {c} {d} {e} {f} {g} {h} {i}".format(**sol))

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 9 8
1 2 3 4 5 6 8 7 9
1 2 3 4 5 6 8 9 7
1 2 3 4 5 6 9 7 8
1 2 3 4 5 6 9 8 7

# ... etc - 9! = 362880 permutations
5 6 7 1 8 2 9 3 4
5 6 7 1 9 2 8 3 4
5 6 8 1 7 2 9 3 4
5 6 8 1 9 2 7 3 4
5 6 9 1 7 2 8 3 4
5 6 9 1 8 2 7 3 4
5 7 6 1 8 2 9 3 4
5 7 6 1 9 2 8 3 4
5 7 8 1 6 2 9 3 4
5 7 8 1 9 2 6 3 4

# ... etc - 5! * 5! = 14400 permutations
9 8 7 4 6 3 5 2 1
9 8 7 4 5 3 6 2 1
9 8 6 4 7 3 5 2 1
9 8 6 4 5 3 7 2 1
9 8 5 4 6 3 7 2 1
9 8 5 4 7 3 6 2 1
9 7 8 4 5 3 6 2 1
9 7 8 4 6 3 5 2 1
9 7 6 4 8 3 5 2 1
9 7 6 4 5 3 8 2 1
9 7 5 4 6 3 8 2 1

# ... etc - 14400 solutions


看看itertools模块,我认为功能就是你想要的,你想测试什么?用文字表达。几乎可以肯定,要做到这一点很容易。@malik你说得对。我正在尝试解决数独问题,需要检查所有行的值是否不同,并且需要它们的索引值不同。它们中的每一个都有不同的域范围,不是所有的域都有从0到9的域。看看itertools模块,我想这个函数就是你想要的,你想测试什么?用文字表达。几乎可以肯定,要做到这一点很容易。@malik你说得对。我正在尝试解决数独问题,需要检查所有行的值是否不同,并且需要它们的索引值不同。它们中的每一个都有不同的域范围,不是所有的域都有一个从0到9的域。除了字母a到i的排列。我通常尽量避免使用变量组合,因为它与整个排列方式相矛盾。@MalikBrahimi:“我希望它们的所有序列都是abcdefghi,这样就没有重复的数字”——我认为这意味着他想要数字。除了字母a到I的排列方式。我通常尽量避免使用变量组合,因为它与整个排列相矛盾。@MalikBrahimi:“我希望所有序列都是abcdefghi,这样就没有重复的数字”——我认为这意味着他需要数字。我实际上是在寻找一种方法来减少条件表达式,但我认为这种方法也可行。谢谢你要我添加for循环版本吗?不,但是如果变量的域不都是0到9呢。在这种情况下我能做什么?第二个参数表示排列的长度。我们使用了9,因为这是字母范围的长度。是的,但是只有当9个for循环从0到9循环时,排列才起作用,但是如果一些for循环的范围不同呢?如何检查不重复数,我想我需要条件表达式。我实际上在寻找一种减少条件表达式的方法,但我认为这种方法也有效。谢谢你要我添加for循环版本吗?不,但是如果变量的域不都是0到9呢。在这种情况下我能做什么?第二个参数表示排列的长度。我们使用了9,因为这是字母范围的长度。是的,但是只有当9个for循环从0到9循环时,排列才起作用,但是如果一些for循环的范围不同呢?如何检查不重复的数字,我想我需要条件表达式。