2017-01-17 2 views
0

у меня есть этот сценарийсписок питон кортежей в список из dicts для использования csv.dictwriter

x=['a','b','c'] #Header 
y=[(1,2,3),(4,5,6)] #data 

Мне нужно создать структуру ниже

[{'a':1, 'b':2, 'c':3}, {'a':4, 'b':5, 'c':6}] 

Любой лучший способ сделать это (подобно питон специалист)

rows=[] 
for row in range(0,len(y)): 
    rec={} 
    for col in range(0, len(x)): 
     rec[x[col]]=y[row][col] 
    rows.append(rec)  
print(rows) 

выше кода даст желаемый результат, но я ищу один лайнер решения некоторых вещей как показано ниже

rows=list(({x[col]:y[row][col]} for row in range(0,len(y)) for col in range(0, len(x)))) 

выход:

[{'a': 1}, {'b': 2}, {'c': 3}, {'a': 4}, {'b': 5}, {'c': 6}] 

, но это дает список как индивидуальный ДИКТ, а не в сочетании Dict. Есть идеи???

ответ

3

Вы можете написать генератор, который выполняет итерацию по данным. Тогда для каждого элемента данных используют zip для генерации Iterable из (header, value) кортежей, которые вы передаете dict:

>>> x = ['a','b','c'] 
>>> y = [(1,2,3),(4,5,6)] 
>>> gen = (dict(zip(x, z)) for z in y) 
>>> list(gen) 
[{'a': 1, 'c': 3, 'b': 2}, {'a': 4, 'c': 6, 'b': 5}] 

Update В приведенном выше примере используется выражением генератора вместо list с написанием кода CSV нужно будет только один по очереди. Для создания полного списка потребуется гораздо больше памяти без каких-либо преимуществ.

+1

Почему генератор? понимание списка делает то, что требуется: '[dict (zip (x, v)) для v в y]' – f5r5e5d

+2

Я уверен, что генератор в случае, если OP имеет большой набор данных и хотел бы оптимизировать эффективность памяти. в противном случае нет проблемы – Parousia

+0

@ f5r5e5d Добавлена ​​возможность выражения выражения генератора для ответа – niemmi

Смежные вопросы