SM1
SM1

Reputation: 1

python list of tuples to list of dicts for use by csv.dictwriter

i have this scenario

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

I need to create below structure

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

Any better way of doing this(like a python expert)

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)

above code will give the desired result, but i am looking for a one liner solution some thing like below

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

output:

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

but this gives list as individual dict's rather than a combined dict. Any ideas???

Upvotes: 0

Views: 58

Answers (1)

niemmi
niemmi

Reputation: 17263

You could write a generator that iterates over data. Then for each item in data use zip to generate iterable of (header, value) tuples that you pass to 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 The example above uses generator expression instead of list since the code writing CSV would only need one row at a time. Generating the full list would require much more memory with no benefit.

Upvotes: 3

Related Questions