#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.