#python #list #dictionary
#python #Список #словарь
Вопрос:
У меня есть формат данных, который выглядит следующим образом:
например,
[('2011', 1, 'value1', '68843'),
('2011', 1, 'value2', '37029'),
('2014', 1, 'value1', '66061'),
('2014', 1, 'value2', '96994'),
('2016', 1, 'value1', '68286'),
('2016', 1, 'value2', '84507'),
('2011', 1, 'value3', '58882')]
и я хочу преобразовать эти данные в приведенный ниже формат, используя python
[{"year":2011,"value1":68843,"value2":37029,"value3":58882},
{"year":2014,"value1":66061,"value2":96994},
{"year":2016,"value1":68286,"value2":84507}]
Какой синтаксически самый чистый способ добиться этого?
Комментарии:
1. Что вы уже пробовали?
Ответ №1:
import collections
values = [
('2011', 1, 'value1', '68843'),
('2011', 1, 'value2', '37029'),
('2014', 1, 'value1', '66061'),
('2014', 1, 'value2', '96994'),
('2016', 1, 'value1', '68286'),
('2016', 1, 'value2', '84507'),
('2011', 1, 'value3', '58882')
]
d = collections.defaultdict(dict)
for year, _, name, value in values:
d[year][name] = value
result = [{'year': year, **values} for year, values in d.items()]
print(result)
Комментарии:
1. Собирался опубликовать что-то подобное, но вы меня опередили.
2. Ответ на SO является конкурентным 🙂
Ответ №2:
Попробуйте это :
a = [('2011', 1, 'value1', '68843'), ('2011', 1, 'value2', '37029'), ('2014', 1, 'value1', '66061'), ('2014', 1, 'value2', '96994'), ('2016', 1, 'value1', '68286'), ('2016', 1, 'value2', '84507'), ('2011', 1, 'value3', '58882')]
c =[]
for i in set([k[0] for k in a]):
temp = {}
temp['year'] =i
for j in a:
if j[0]==i:
temp[j[2]] = int(j[-1])
c.append(temp)
ВЫВОД :
[{'year': '2011', 'value1': 68843, 'value2': 37029, 'value3': 58882}, {'year': '2014', 'value1': 66061, 'value2': 96994}, {'year': '2016', 'value1': 68286, 'value2': 84507}]
Ответ №3:
Вот идея, в два прохода:
from collections import defaultdict
ts = [('2011', 1, 'value1', '68843'), ('2011', 1, 'value2', '37029'),
('2014', 1, 'value1', '66061'), ('2014', 1, 'value2', '96994'),
('2016', 1, 'value1', '68286'), ('2016', 1, 'value2', '84507'),
('2011', 1, 'value3', '58882')]
# first, collect the data corresponding to a single year
d = defaultdict(list)
for year, _, val, num in ts:
d[year].append((val, num))
# second, consolidate it in a list
[dict([['year', year]] vals) for year, vals in d.items()]
=> [{'value2': '96994', 'value1': '66061', 'year': '2014'},
{'value2': '84507', 'value1': '68286', 'year': '2016'},
{'value3': '58882', 'value2': '37029', 'value1': '68843', 'year': '2011'}]
Комментарии:
1. Казалось бы, использование
defaultdict(dict)
и затемfor year, _, name, value in data: d[year][name] = value
было бы прекрасно…