Сравните два списка словарей и создайте новый список со всеми ключами и значениями в python

#python #list #dictionary

#python #Список #словарь

Вопрос:

 a = [{'a':{'a':1}}, {'b':{'b':1}}, {'c':{}}]
b = [{'a':{'a':1,'b':0}}, {'b':{'a':1}}]
  

Здесь у меня есть два списка dict. Я хочу сравнить их и создать новый список, подобный этому:

 newlist = [{'a':{'a':1,'b':0}}, {'b':{'a':1,'b':1}}, {'c':{'a':0,'b':0}}]
  

Комментарии:

1. Вам нужно быть более конкретным в отношении того, какая функциональность вам нужна из этой функции. Также опубликуйте некоторый конкретный код того, что вы пробовали до сих пор.

2. я хочу сгенерировать полный список словарей, в которых будут найдены недостающие ключи и значения. у меня есть инициализированный пустой список dict, подобный этому a= [{‘a’:{}},{‘b’:{}},{‘c’:{}}], и я получаю такие данные, как b = [{‘a’:{‘a’:1}}, {‘b’:{‘b’:1}}] теперь я хотел, чтобы c = [ {‘a’:{‘a’:1,’b’:0}}, {‘b’:{‘a’:0,’b’:1}} ]

3. Вы хотите что-то вроде этого? A= [{'a':{}},{'b':{}},{'c':{}}]; B = [{'a':{'A':1}}, {'b':{'B':1}}] и результирующий список C = [ {'a':{'A':1,'B':0}}, {'b':{'A':0,'B':1}}, {'c':{'A':0,'B':0}}]]

4. @fabianegli да, именно этого я и хочу

Ответ №1:

 A_list = [{'a':{'A':1}}, {'b':{}}]
B_list = [{'b': {'B': 1}}, {'a': {'A': 0}}]
list_with_all_keys = [{'a':{}}, {'b':{}}, {'c':{}}]
new_lod = [{k:{'A':(1 if k in A_list and 'A' in A_list[k] and A_list[k]['A'] is 1 else 0), 
               'B':(1 if k in B_list and 'B' in B_list[k] and B_list[k]['B'] is 1 else 0)}} 
           for k in [list(n.keys())[0] for n in list_with_all_keys]]
  

new_lod тогда [{'a': {'B': 0, 'A': 0}}, {'b': {'B': 0, 'A': 0}}, {'c': {'B': 0, 'A': 0}}]

Обратите внимание, что я добавил несколько прописных букв, чтобы прояснить, что происходит, это также работает, если вы используете только строчные буквы a и b вместо A / A_list и B / B_list соответственно.

Боковое примечание

Я предполагаю, что вы не получаете дубликаты ключей на первом уровне словарей в списке. Я думаю, что это правильное предположение, поскольку требуемый вывод приведет к свертыванию этих дубликатов ключей в словарях первого уровня. Таким образом, вы можете пропустить список и использовать один словарь вместо списка словарей. Это немного упрощает выражения. Но в зависимости от вашего приложения могут быть даже лучшие (проще говоря) способы сравнения или / и объединения двух списков, словарей или наборов.

 A_dict = {'a':{'A':1}, 'b':{}}
B_dict = {'b': {'B': 1}, 'a': {'A': 0}}
dict_with_all_keys = {'a':{}, 'b':{}, 'c':{}}
# a dictionary solution with no list
new_dict = {k:{'A':(1 if k in A_dict and 'A' in A_dict[k] and A_dict[k]['A'] is 1 else 0), 
               'B':(1 if k in B_dict and 'B' in B_dict[k] and B_dict[k]['B'] is 1 else 0)} 
            for k in dict_with_all_keys}
  

Ответ №2:

Более читаемый способ сделать это был бы

 a = [{'a':{'a':1}}, {'b':{'b':1}}, {'c':{}}]
b = [{'a':{'a':1,'b':0}}, {'b':{'a':1}}]

result = {}

for c in a   b:
    for key,value in c.items():
        result[key] = dict()
        result[key]['a'] = value.get('a', 0)
        result[key]['b'] = value.get('b', 0)

print(result)
  

Даст вам ответ
{'c': {'a': 0, 'b': 0}, 'a': {'a': 1, 'b': 0}, 'b': {'a': 1, 'b': 0}}

Комментарии:

1. Хотя ваше решение имеет образовательную ценность, вы игнорируете формат, требуемый OP.