Генерация строки из ключей словаря (комбинаций) и присвоение логического значения на основе значений

У меня есть структура, похожая на словарь словарей:

cont  = {

'perm': { 'r': False, 'rw': True}

'prig':  { 'sq': False, 'rot':False, 'rq':True}

'anon':  {'100': False, '500':True, '99':False; '400':False}

}

Из этой структуры мне нужно сгенерировать строку из ключей и узнать, является ли строка False или True на основе значений:

Пример:

'perm', 'prig', 'anon' will become: 'r,sq,100' or 'rw,sq,100' or 'r,rq,100'.
  1. Мне нужно сгенерировать все перестановки ключей второго уровня.
  2. Для каждой строки мне нужно связать логическое значение, используя 'AND', True или False. Для приведенного выше примера:
False,False,False -> False;  True,False,False -> True,False,True, False -> False;

Если вы знаете, что вам нужно сгенерировать перестановки, вы хотя бы пытались реализовать эту часть?

roganjosh 29.05.2019 20:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
97
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать itertools.product:

import itertools
cont = {'perm': {'r': False, 'rw': True}, 'prig': {'sq': False, 'rot': False, 'rq': True}, 'anon': {'100': False, '500': True, '99': False, '400': False}}
keys = {a:list(b) for a, b in cont.items()}
p = list(itertools.product(*_keys.values()))
result = [[cont[[a for a, b in keys.items() if c in b][0]][c] for c in i] for i in p]
new_result = [any(i) for i in result]

Выход:

#result:
[[False, False, False], [False, False, True], [False, False, False], [False, False, False], [False, False, False], [False, False, True], [False, False, False], [False, False, False], [False, True, False], [False, True, True], [False, True, False], [False, True, False], [True, False, False], [True, False, True], [True, False, False], [True, False, False], [True, False, False], [True, False, True], [True, False, False], [True, False, False], [True, True, False], [True, True, True], [True, True, False], [True, True, False]]
#new_result
[False, True, False, False, False, True, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]
#list(map(','.join, prod))
['r,sq,100', 'r,sq,500', 'r,sq,99', 'r,sq,400', 'r,rot,100', 'r,rot,500', 'r,rot,99', 'r,rot,400', 'r,rq,100', 'r,rq,500', 'r,rq,99', 'r,rq,400', 'rw,sq,100', 'rw,sq,500', 'rw,sq,99', 'rw,sq,400', 'rw,rot,100', 'rw,rot,500', 'rw,rot,99', 'rw,rot,400', 'rw,rq,100', 'rw,rq,500', 'rw,rq,99', 'rw,rq,400']
Ответ принят как подходящий

Вот мой взгляд на задание. В нем намного больше кода, чем в ответе @Ajax1234, но я надеюсь, что для некоторых его будет легче понять/читать.

import itertools
data = {
    'test': {'a': False, 'b': True},
    'perm': {'r': False, 'rw': True},
    'prig': {'sq': False, 'rq': True},
    'anon': {'100': False, '500': True},
}

# define the order of the keys
key_order = ('perm', 'prig', 'anon', 'test')

# build a list of iterables for the 'product()' function
iterables = [
    sorted(data[k].keys())
    for k in key_order]
print(iterables)

print()
print('{:3s} {:20s} {:30s} {}'.format('i', 'elements', 'value of elements', 'AND'))

for i, elements in enumerate(itertools.product(*iterables)):
    # get the values for all the elements, in the correct order
    values = [
        data[k][sub_k]
        for k, sub_k in zip(key_order, elements)]

    print('{:3d} {:20s} {:30s} {}'.format(
        i+1,
        ','.join(elements),
        str(values),
        all(values)))

Этот код дает мне следующий вывод:

[['r', 'rw'], ['rq', 'sq'], ['100', '500'], ['a', 'b']]

i   elements             value of elements              AND
  1 r,rq,100,a           [False, True, False, False]    False
  2 r,rq,100,b           [False, True, False, True]     False
  3 r,rq,500,a           [False, True, True, False]     False
  4 r,rq,500,b           [False, True, True, True]      False
  5 r,sq,100,a           [False, False, False, False]   False
  6 r,sq,100,b           [False, False, False, True]    False
  7 r,sq,500,a           [False, False, True, False]    False
  8 r,sq,500,b           [False, False, True, True]     False
  9 rw,rq,100,a          [True, True, False, False]     False
 10 rw,rq,100,b          [True, True, False, True]      False
 11 rw,rq,500,a          [True, True, True, False]      False
 12 rw,rq,500,b          [True, True, True, True]       True
 13 rw,sq,100,a          [True, False, False, False]    False
 14 rw,sq,100,b          [True, False, False, True]     False
 15 rw,sq,500,a          [True, False, True, False]     False
 16 rw,sq,500,b          [True, False, True, True]      False

Другие вопросы по теме