获取Python中所有可能的变量/参数组合,但始终包括所有变量

获取Python中所有可能的变量/参数组合,但始终包括所有变量,python,combinations,itertools,Python,Combinations,Itertools,我想写一个Python脚本,它提供一些变量和参数的所有可能组合,但总是在结果中包含所有变量 我试过几次,但最接近的是所有的组合。例如,假设a、b、c、d和e可以是真的,也可以是假的。我想要所有可能的组合,但重要的是,我每次都试图包含所有这些变量。因此,以下两个示例在结果中是有效的: a:正确,b:错误,c:错误,d:错误,e:错误 a:正确,b:正确,c:错误,d:错误,e:错误注b不同 但以下不是我想要的: a:对,c:错 我想要所有可能的组合,但总是包括a-e Martijn Pieters

我想写一个Python脚本,它提供一些变量和参数的所有可能组合,但总是在结果中包含所有变量

我试过几次,但最接近的是所有的组合。例如,假设a、b、c、d和e可以是真的,也可以是假的。我想要所有可能的组合,但重要的是,我每次都试图包含所有这些变量。因此,以下两个示例在结果中是有效的: a:正确,b:错误,c:错误,d:错误,e:错误 a:正确,b:正确,c:错误,d:错误,e:错误注b不同

但以下不是我想要的: a:对,c:错

我想要所有可能的组合,但总是包括a-e

Martijn Pieters已经提供了一个答案,这基本上就是我想要的减去所有变量都被表示的要求。以下是Pieters的代码:

from itertools import product

for combo in product((None, True, False), repeat=3):
    arguments = {k: v for k, v in zip('abc', combo) if v is not None}
    print arguments

>>> from itertools import product
>>> for combo in product((None, True, False), repeat=3):
...     arguments = {k: v for k, v in zip('abc', combo) if v is not None}
...     print arguments
... 
{}
{'c': True}
{'c': False}
{'b': True}
{'c': True, 'b': True}
{'c': False, 'b': True}
{'b': False}
{'c': True, 'b': False}
{'c': False, 'b': False}
{'a': True}
{'a': True, 'c': True}
{'a': True, 'c': False}
{'a': True, 'b': True}
{'a': True, 'c': True, 'b': True}
{'a': True, 'c': False, 'b': True}
{'a': True, 'b': False}
{'a': True, 'c': True, 'b': False}
{'a': True, 'c': False, 'b': False}
{'a': False}
{'a': False, 'c': True}
{'a': False, 'c': False}
{'a': False, 'b': True}
{'a': False, 'c': True, 'b': True}
{'a': False, 'c': False, 'b': True}
{'a': False, 'b': False}
{'a': False, 'c': True, 'b': False}
{'a': False, 'c': False, 'b': False}
'''
忽略None选项这几乎正是我一直试图做的,但是在这个例子中,我不想仅仅返回a为false。我希望它返回的组合要少得多,因为a、b和c应该始终包含在内。我想从中得到的只是它们是真是假的组合

修改此示例以获得正确结果的最佳方法是什么?还是你推荐一种完全不同的方法?非常感谢。

只需从可能的值中删除“无”,然后按变量计数的数量重复:

from itertools import product

vars = 'abcde'
for combo in product((True, False), repeat=len(vars)):
    arguments = {k: v for k, v in zip(vars, combo)}
    print( arguments )
请注意,如果保持repeat=3,则只能得到a-c的结果

正如@Colin所提到的,如果v不是None,则可以删除,因为在这种情况下,值永远不能是None

输出:

{'e': True, 'd': True, 'b': True, 'c': True, 'a': True}
{'e': False, 'd': True, 'b': True, 'c': True, 'a': True}
{'e': True, 'd': False, 'b': True, 'c': True, 'a': True}
{'e': False, 'd': False, 'b': True, 'c': True, 'a': True}
{'e': True, 'd': True, 'b': True, 'c': False, 'a': True}
{'e': False, 'd': True, 'b': True, 'c': False, 'a': True}
{'e': True, 'd': False, 'b': True, 'c': False, 'a': True}
{'e': False, 'd': False, 'b': True, 'c': False, 'a': True}
{'e': True, 'd': True, 'b': False, 'c': True, 'a': True}
{'e': False, 'd': True, 'b': False, 'c': True, 'a': True}
{'e': True, 'd': False, 'b': False, 'c': True, 'a': True}
{'e': False, 'd': False, 'b': False, 'c': True, 'a': True}
{'e': True, 'd': True, 'b': False, 'c': False, 'a': True}
{'e': False, 'd': True, 'b': False, 'c': False, 'a': True}
{'e': True, 'd': False, 'b': False, 'c': False, 'a': True}
{'e': False, 'd': False, 'b': False, 'c': False, 'a': True}
{'e': True, 'd': True, 'b': True, 'c': True, 'a': False}
{'e': False, 'd': True, 'b': True, 'c': True, 'a': False}
{'e': True, 'd': False, 'b': True, 'c': True, 'a': False}
{'e': False, 'd': False, 'b': True, 'c': True, 'a': False}
{'e': True, 'd': True, 'b': True, 'c': False, 'a': False}
{'e': False, 'd': True, 'b': True, 'c': False, 'a': False}
{'e': True, 'd': False, 'b': True, 'c': False, 'a': False}
{'e': False, 'd': False, 'b': True, 'c': False, 'a': False}
{'e': True, 'd': True, 'b': False, 'c': True, 'a': False}
{'e': False, 'd': True, 'b': False, 'c': True, 'a': False}
{'e': True, 'd': False, 'b': False, 'c': True, 'a': False}
{'e': False, 'd': False, 'b': False, 'c': True, 'a': False}
{'e': True, 'd': True, 'b': False, 'c': False, 'a': False}
{'e': False, 'd': True, 'b': False, 'c': False, 'a': False}
{'e': True, 'd': False, 'b': False, 'c': False, 'a': False}
{'e': False, 'd': False, 'b': False, 'c': False, 'a': False}

由于这只是一个二进制计数器,因此不需要itertools:

params = "abcd"
N      = len(params)
combos = [{params[p]:n&(1<<p)>0 for p in range(N)} for n in range(1<<N)] 

[{'a': False, 'b': False, 'c': False, 'd': False}, 
 {'a': True,  'b': False, 'c': False, 'd': False}, 
 {'a': False, 'b': True,  'c': False, 'd': False}, 
 {'a': True,  'b': True,  'c': False, 'd': False}, 
 {'a': False, 'b': False, 'c': True,  'd': False}, 
 {'a': True,  'b': False, 'c': True,  'd': False}, 
 {'a': False, 'b': True,  'c': True,  'd': False}, 
 {'a': True,  'b': True,  'c': True,  'd': False}, 
 {'a': False, 'b': False, 'c': False, 'd': True}, 
 {'a': True,  'b': False, 'c': False, 'd': True}, 
 {'a': False, 'b': True,  'c': False, 'd': True}, 
 {'a': True,  'b': True,  'c': False, 'd': True}, 
 {'a': False, 'b': False, 'c': True,  'd': True}, 
 {'a': True,  'b': False, 'c': True,  'd': True}, 
 {'a': False, 'b': True,  'c': True,  'd': True}, 
 {'a': True,  'b': True,  'c': True,  'd': True}]

只需从product的第一个参数的元组中删除None:对于productTrue中的combo,False,repeat=3。如果v不是None,则在下一行中不再需要它,但将其保留在中不会有任何影响,因为v永远不会是None。这里不是回答了这个问题吗?
params = "abcd"
N      = len(params)
combos = [{p:v for p,v in zip(params,c)} for c in product(*[(False,True)]*N)]