Как преобразовать цикл for в понимание списка

#python #python-3.x #list-comprehension

#python #python-3.x #понимание списка

Вопрос:

 a = []
b = {}
for list1 in tasks:
    for dict2 in list1:
        b.update(dict2)
    a.append(b)
  

Как я могу написать этот код как понимание списка?

Я пробовал это, но это не сработало:

 a = [ [ b.update(dict2) for dict2 in list1 ] for list1 in tasks ]
  

мой json:

 tasks = [[{'tuition_eea_amount': '2083', 'tuition_eea_currency': 'EUR', 'tuition_eea_unit': 'year'}, 
{'tuition_international_amount': '16200', 'tuition_international_currency': 'EUR', 'tuition_international_unit': 'year'}], 
[{'tuition_eea_amount': '2083', 'tuition_eea_currency': 'EUR', 'tuition_eea_unit': 'year'}, 
{'tuition_international_amount': '16200', 'tuition_international_currency': 'EUR', 'tuition_international_unit': 'year'}]]
  

Я хочу преобразовать его в:

 a = [[{'tuition_eea_amount': '2083', 'tuition_eea_currency': 'EUR', 'tuition_eea_unit': 'year', 'tuition_international_amount': '16200', 'tuition_international_currency': 'EUR', 'tuition_international_unit': 'year'}, 
{'tuition_eea_amount': '2083', 'tuition_eea_currency': 'EUR', 'tuition_eea_unit': 'year', 'tuition_international_amount': '16200', 'tuition_international_currency': 'EUR', 'tuition_international_unit': 'year'}]]
  

Должен быть один список с двумя словарями внутри. Но теперь это два списка с двумя словарями внутри каждого из них.

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

1. Вы уверены, что это то, что вы хотите? Ваш первый фрагмент, похоже, делает a = [b, b, ... b]

2. @quamrana мой первый фрагмент работает и возвращает мне список, который я хочу.

3. Это происходит потому, что оба ваших списка tasks имеют одинаковые dicts. Попробуйте использовать разные данные, и вы увидите, что конечный результат остается тем же

4. @Tomerikoo, спасибо за разъяснения. Я этого не видел

Ответ №1:

Похоже, вы хотите создать объединенный dict из всех dict в каждом списке tasks . Для того, что вы можете сделать:

 a = [{k: v for dict2 in list1 for k, v in dict2.items()} for list1 in tasks]
  

В случае повторяющихся ключей между диктами это сохранит последний встреченный.


Используемый здесь dict-comp в основном эквивалентен использованию update в цикле. Он перебирает все dicts и для каждого обновляет новый dict со всеми key: value парами. Тогда te list-comp просто делает это для всех вложенных списков tasks .

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

1. Приятно! Он выполняет свою работу! Я не знал, что мы можем писать несколько циклов for внутри одного списка или dict.