#python #recursion
#python #рекурсия
Вопрос:
Я пытаюсь написать словарь, содержащий каждую комбинацию логических значений True и False для x количества переменных. До сих пор я делал это многословным способом, и я знаю, что мог бы упростить это с помощью рекурсии, но я не понимаю, как я мог это сделать. Если кто-нибудь может помочь мне изменить этот код, было бы здорово, пожалуйста.
def vars(self) :
return self.left.vars() | self.right.vars()
def dict(self):
if len(self.vars()) > 0 :
d = {i : True for i in self.vars() }
d1 = {i : False for i in self.vars() }
if len(self.vars()) > 1 :
d2 = d.copy()
d2[list(self.vars())[1]] = False
d3 = d1.copy()
d3[list(self.vars())[1]] = True
if len(self.vars()) > 2 :
d4 = d2.copy()
d4[list(self.vars())[2]] = False
d5 = d4.copy()
d5[list(self.vars())[1]] = True
d6 = d3.copy()
d6[list(self.vars())[2]] = True
d7 = d6.copy()
d7[list(self.vars())[1]] = False
return [d, d1, d2, d3, d4, d5, d6, d7]
return [d, d1, d2, d3]
return [d, d1]
Итак, мой возврат выглядит примерно так…
[{'x': True}, {'x': False}]
для одной переменной и для 3 это
[{'r': True, 'p': True, 'q': True},
{'r': False, 'p': False, 'q': False},
{'r': True, 'p': False, 'q': True},
{'r': False, 'p': True, 'q': False},
{'r': True, 'p': False, 'q': False},
{'r': True, 'p': True, 'q': False},
{'r': False, 'p': True, 'q': True},
{'r': False, 'p': False, 'q': True}]
self.vars() возвращает набор переменных в выражении — в моем коде это доходит только до 3 переменных, поэтому мой код для словаря доходит только до 3 переменных, но я знаю, что смогу сделать это для любого количества переменных.
Вероятно, мне следует создать цикл for и вызвать мою функцию для добавления в словарь, я просто не уверен, как это реализовать.
Редактировать: я не могу импортировать разные функции для этого
Ответ №1:
привет, вам нужно увидеть двоичный файл, чтобы решить эту проблему:
def dict(self):
list_of_dict=[]
for i in range(2**len(self.vars)):
my_dict={}
for j in range(len(self.vars)): # 0 for false and 1 for true (we have 2^self.vars)
if ((i >> j) % 2)==0:
my_dict[list(self.vars())[j]]=False
else:
my_dict[list(self.vars())[j]]=True
list_of_dict.append(my_dict)
return list_of_dict
Комментарии:
1.
my_dict[list(self.vars())[j]] = ((i >> j) % 2) == 0
или поскольку вы используете двоичные операции((i>>j) amp; 1 == 0
2. да, возможно, я просто пытаюсь писать простой код, ваша идея была отличной для более короткого кода, большое спасибо. @thebjorn
3. О, это делает все намного проще — большое вам спасибо!
4. Изучая этот код, я понимаю, что вы использовали ‘>>’, которого я раньше не видел. Я искал, и это битовый сдвиг??? Как это используется? Есть ли альтернативный способ сделать это или это нужно сделать таким образом? Спасибо
5. @pythonc0der это побитовый оператор, почему вы хотите это реализовать?, он меняет десятичную дробь на двоичную, а затем сдвигается вправо, например, 8>> 2 = 1000>> 2, а затем final у нас есть 10 = 2
Ответ №2:
Самый простой способ — понять, что получение всех комбинаций — это то же самое, что подсчет в двоичном формате, где каждая двоичная цифра соответствует переменной:
def combinations(vars):
dicts = []
for i in range(2 ** len(vars)): # each binary digit represents a variable
binarystr = bin(i)[2:].zfill(len(vars)) # '0b10101' => '000010101'
dicts.append(dict(zip(vars, [digit == '1' for digit in binarystr])))
return dicts
пример запуска:
>>> combinations(['a', 'b'])
[{'b': False, 'a': False}, {'b': True, 'a': False}, {'b': False, 'a': True}, {'b': True, 'a': True}]
>>> combinations(['a', 'b', 'c'])
[{'b': False, 'c': False, 'a': False}, {'b': False, 'c': True, 'a': False}, {'b': True, 'c': False, 'a': False}, {'b': True, 'c': True, 'a': False}, {'b': False, 'c': False, 'a': True}, {'b': False, 'c': True, 'a': True}, {'b': True, 'c': False, 'a': True}, {'b': True, 'c': True, 'a': True}]
Ответ №3:
Для начала вы можете попробовать это:
from itertools import product
bools = [[True, False]] * 3 # Or any other value
list(product(*v))
[(True, True, True),
(True, True, False),
(True, False, True),
(True, False, False),
(False, True, True),
(False, True, False),
(False, False, True),
(False, False, False)]
Прикрепление имен переменных к каждому bool и преобразование каждого в словари должно быть простым!
Комментарии:
1. Спасибо, извините, что я не указал, но я не могу импортировать дополнительные функции для этого, я знаю, что это сделало бы это намного проще.