Получить все возможные комбинации переменных / аргументов в Python, но всегда включая все переменные - PullRequest
0 голосов
/ 24 июня 2019

Я хочу написать скрипт на Python, который предоставляет все возможные комбинации некоторых переменных и аргументов, но всегда включать все переменные в результаты.

Я пробовал несколько попыток, но самая близкая, я могуполучить буквально все комбинации.Например, скажем, a, b, c, d и e могут быть либо истинными, либо ложными.Я хочу все возможные комбинации, но важно, что я пытаюсь включить все эти переменные каждый раз.Таким образом, следующие два примера верны среди результатов: a: истина, b: ложь, c: ложь, d: ложь, e: ложь a: истина, b: истина, c: ложь, d: ложь, e: ложь (примечание b отличается)

Но следующее НЕ то, что я ищу: a: true, c: false

Я хочу все возможные комбинации, но всегда включая ae.

Существует ответ, уже предоставленный Martijn Pieters, который, по сути, является тем, что я хочу, за исключением требования, чтобы все переменные были представлены ( Найдите все возможные комбинации аргументов в 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 равно false.Я хотел бы, чтобы он возвращал гораздо меньше комбинаций, потому что всегда должны быть включены a, b и c.Я просто хочу получить из этого комбинацию того, являются ли они истинными или ложными.

Как лучше всего изменить этот пример для достижения правильных результатов?Или вы рекомендуете совершенно другой подход?Большое спасибо.

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Поскольку это просто двоичный счетчик, вам не нужны 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)]
0 голосов
/ 24 июня 2019

Просто удалите None из возможных значений и повторите с номером вашей переменной count:

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, вы получите результаты только для переменного.

Как уже упоминалось @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}
...