我想编写一个Python脚本,该脚本提供某些变量和参数的所有可能组合,但始终在结果中包含所有变量。
我尝试了几次尝试,但实际上我能得到的最接近的是所有组合。例如,假设a,b,c,d和e可以为true或false。我想要所有可能的组合,但重要的是,我每次都试图包含所有这些变量。因此,以下两个示例在结果中有效: a:true,b:false,c:false,d:false,e:false a:true,b:true,c:false,d:false,e:false(请注意b是不同的)
但是以下不是我想要的: a:true,c:false
我想要所有可能的组合,但始终包含a-e。
马丁·皮特斯(Martijn Pieters)已经提供了一个答案,这基本上是我想要的减去所有变量都必须表示的要求(Find all possible combinations of arguments in Python)。这是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为假。我希望它返回的组合要少得多,因为应始终包含a,b和c。我想从中得出它们是真还是假的组合。
修改此示例以获得正确结果的最佳方法是什么?还是您建议一种完全不同的方法?非常感谢。
答案 0 :(得分:1)
由于这只是二进制计数器,因此不需要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}]
我必须承认,虽然使用产品使其更易于阅读(但这可能是个见解):
params = "abcd"
N = len(params)
combos = [{p:v for p,v in zip(params,c)} for c in product(*[(False,True)]*N)]
答案 1 :(得分:0)
只需从可能的值中删除None
,然后重复变量计数的数字即可:
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所述,您可以删除if v is not 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}