Манипуляции с вложенными списками Python

Привет всем разработчикам Python, я играл со списками Python и библиотекой Pandas, и у меня возникли проблемы с задачами манипулирования списками. Я хочу объединить все элементы словаря test_list[i][0] в один индекс вложенного списка в соответствии с тем же именем состояния в индексе 0 каждого вложенного списка.

Пример ввода:

test_list= [['Alabama', {'Baldwin County': 182265}],
 ['Alabama', {'Barbour County': 27457}],
 ['Arkansas', {'Newton County': 8330}],
 ['Arkansas', {'Perry County': 10445}],
 ['Arkansas', {'Phillips County': 21757}],
 ['California', {'Madera County': 150865}],
 ['California', {'Marin County': 252409}],
 ['Colorado', {'Adams County': 441603}],
 ['Colorado', {'Alamosa County': 15445}],
 ['Colorado', {'Arapahoe County': 572003}]
]

Пример вывода:

test_list1= [['Alabama', {'Baldwin County': 182265, 'Barbour County': 27457}],
 ['Arkansas', {'Newton County': 8330, 'Perry County': 10445, 'Phillips County': 21757}],
 ['California', {'Madera County': 150865, 'Marin County': 252409}],
 ['Colorado', {'Adams County': 441603, 'Alamosa County': 15445, 'Arapahoe County': 572003}]
]

Я пробовал много подходов к решению этой проблемы, но пока безуспешно. Я начинающий разработчик Python. Спасибо за помощь заранее.


person Furqan Asghar    schedule 30.10.2019    source источник
comment
ввод второго образца вы имеете в виду ожидаемый результат? что вы хотите, чтобы ваш список выглядел?   -  person Tserenjamts    schedule 30.10.2019
comment
Да!! Пример вывода (отредактированный)   -  person Furqan Asghar    schedule 30.10.2019


Ответы (2)


Подход

  • Используйте collections.defaultdict для группировки данных по общее поле (в данном случае по состоянию).

  • Для каждого состояния defaultdict создает новый dict, который обновляется с помощью метода dict.update().

  • Превратите результат обратно в список с применением list к элементам словаря (пары ключ/значение).

Рабочий код

>>> from pprint import pprint
>>> from collections import defaultdict
>>> d = defaultdict(dict)
>>> for state, info in test_list:
        d[state].update(info)

>>> result = list(d.items())
>>> pprint(result)
[('Alabama', {'Baldwin County': 182265, 'Barbour County': 27457}),
 ('Arkansas',
  {'Newton County': 8330, 'Perry County': 10445, 'Phillips County': 21757}),
 ('California', {'Madera County': 150865, 'Marin County': 252409}),
 ('Colorado',
  {'Adams County': 441603, 'Alamosa County': 15445, 'Arapahoe County': 572003})]
person Raymond Hettinger    schedule 30.10.2019
comment
Большое спасибо за быстрый ответ @raymond-hettinger. Ваше решение сработало эффективно. :) - person Furqan Asghar; 30.10.2019
comment
Если требуется список списков (вместо списка кортежей), то результат может быть записан как [[*pair] для пары в d.items()] - person Aivar Paalberg; 30.10.2019

Python3.5 или новее

tmp_dict = {}
for lst in test_list:
city = lst[0]
country = lst[1]
if city in tmp_dict:
    tmp_dict[city] = {**tmp_dict[city], **country}
else:
    tmp_dict[city] = country
print(tmp_dict) #you will get dict result
#If you want to get list only
output_result = []
for k in tmp_dict:
    tmp_list.append([k,tmp_dict[k]])
print(output_result) #you will get list result
person wailinux    schedule 30.10.2019