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

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

c  = {

'usize': { '500': False, '100': True}

'isize':  { '200': False, '800':False, '900':True}

'path':  {'/tmp': False, '/var':True, '/tp12':False;}

}

Мне нужно объединить все значения, создать массив нового словаря и связать словарь со значениями Боллеана на основе ключей. Можно использовать что-то еще, кроме словарей.

Пример:

c1 = {

'usize': 500,
'isize': 200,
'path': '/tmp' }

Associated value, False and False and False = False

c2 = {

'usize': 100,
'isize': 900,
'path': '/var' }

Associated value, True  and True and True = True

c2 = {

'usize': 500,
'isize': 900,
'path': '/var' }

Associated value, False  and True and True = False

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Вы можете сделать это, используя itertools product и некоторые манипуляции с выводом, чтобы получить нужные дикты

from itertools import product

c  = {

'usize': { '500': False, '100': True},

'isize':  { '200': False, '800':False, '900':True},

'path':  {'/tmp': False, '/var':True, '/tp12':False}

}

result = []
for group in product(*c.values()): #this makes all product groups of values such as (500, 200, '/var') etc.
    temp = dict(zip(c.keys(), group)) #bring back the keys for every group
    #create a new 'value' key with the boolean result
    temp['value'] = all(c[k][v] for k, v in temp.items()) #change to .iteritems() for python 2
    result.append(temp)
print(result)

Выход:

[{'usize': '500', 'isize': '200', 'path': '/tmp', 'value': False},
 {'usize': '500', 'isize': '200', 'path': '/var', 'value': False},
 {'usize': '500', 'isize': '200', 'path': '/tp12', 'value': False},
 {'usize': '500', 'isize': '800', 'path': '/tmp', 'value': False},
 {'usize': '500', 'isize': '800', 'path': '/var', 'value': False},
 {'usize': '500', 'isize': '800', 'path': '/tp12', 'value': False},
 {'usize': '500', 'isize': '900', 'path': '/tmp', 'value': False},
 {'usize': '500', 'isize': '900', 'path': '/var', 'value': False},
 {'usize': '500', 'isize': '900', 'path': '/tp12', 'value': False},
 {'usize': '100', 'isize': '200', 'path': '/tmp', 'value': False},
 {'usize': '100', 'isize': '200', 'path': '/var', 'value': False},
 {'usize': '100', 'isize': '200', 'path': '/tp12', 'value': False},
 {'usize': '100', 'isize': '800', 'path': '/tmp', 'value': False},
 {'usize': '100', 'isize': '800', 'path': '/var', 'value': False},
 {'usize': '100', 'isize': '800', 'path': '/tp12', 'value': False},
 {'usize': '100', 'isize': '900', 'path': '/tmp', 'value': False},
 {'usize': '100', 'isize': '900', 'path': '/var', 'value': True},
 {'usize': '100', 'isize': '900', 'path': '/tp12', 'value': False}]
0 голосов
/ 30 мая 2019

Одно из предложений, которое я мог бы предложить, - создать комбинированный словарь, в котором вы будете связывать вложенные ключи вместе с разделителем (я выбрал :, можно использовать любой другой разделитель)

Таким образом, исходный словарь изменится на

{'usize:500': False, 'usize:100': True, 
'isize:200': False, 'isize:800': False, 'isize:900': True, 
'path:/tmp': False, 'path:/var': True, 'path:/tp12': False}

через код

res = {'{}:{}'.format(key1,key2):value for key1,value1 in c.items() for key2, value in value1.items() }
print(res)

Затем мы можем легко использовать словарь res для вычисления логических значений для c1,c2... после итерации с ключом, парами значений c1,c2.. и т. Д.

c1_val = all(res['{}:{}'.format(k,v)] for k,v in c1.items())
print(c1_val)

c2_val = all(res['{}:{}'.format(k,v)] for k,v in c2.items())
print(c2_val)

c3_val = all(res['{}:{}'.format(k,v)] for k,v in c3.items())
print(c3_val)

А на выходе будет

False
True
False
...