3

Imagine that you have the following list.

name = ['bob', 'kate', 'john']
age = [35, 12, 57]
gender = ["Male", "Female", "Male"]

How do you convert it to an array of dictionary?

[
  {
    "name": "bob"
    "age": 35
    "gender": "Male"
  },
  {
    "name": "kate"
    "age": 12
    "gender": "Female"
  },
  {
    "name": "john"
    "age": 57
    "gender": "Male"
  }
]
Ishan
  • 3,931
  • 11
  • 37
  • 59

6 Answers6

3

Using zip ,List comprehension

Code:

name = ['bob', 'kate', 'john']
age = [35, 12, 57]
gender = ["Male", "Female", "Male"]

dic= [ {"name":val[0], "age":val[1], "gender":val[2]} for val in zip(name, age, gender)]

Output:

[{'name':'bob','age':35,'gender':'Male'},
 {'name':'kate','age':12,'gender':'Female'},
 {'name':'john','age':57,'gender':'Male'}]
Community
  • 1
  • 1
The6thSense
  • 8,103
  • 8
  • 31
  • 65
  • This outputs `[set(['name:bob,age:35,gender:Male']), set(['name:kate,age:12,gender:Female']), set(['name:john,age:57,gender:Male'])]` – Ishan Dec 12 '15 at 05:41
3

A generic method which works for any number of lists with customizable field names

import pprint
def make_complex(**kwargs):
    return [dict(zip(kwargs.keys(), a)) for a in zip(*kwargs.values())]

name = ['bob', 'kate', 'john']
age = [35, 12, 57]
gender = ["Male", "Female", "Male"]

l = make_complex(name=name, age=age, gender=gender)
pprint.pprint(l)

l = make_complex(user=name, year=age, sex=gender)
pprint.pprint(l)

output:

[{'age': 35, 'gender': 'Male', 'name': 'bob'},
 {'age': 12, 'gender': 'Female', 'name': 'kate'},
 {'age': 57, 'gender': 'Male', 'name': 'john'}]
[{'sex': 'Male', 'user': 'bob', 'year': 35},
 {'sex': 'Female', 'user': 'kate', 'year': 12},
 {'sex': 'Male', 'user': 'john', 'year': 57}]
Anurag Uniyal
  • 85,954
  • 40
  • 175
  • 219
2

Using a simple loop it would look something like:

name = ['bob', 'kate', 'john']
age = [35, 12, 57]
gender = ["Male", "Female", "Male"]

list=[]

for i in range(len(name)):
  temp={}
  temp['name']=name[i]
  temp['age']=age[i]
  temp['gender']=gender[i]
  list.append(temp)
suvayu
  • 4,271
  • 2
  • 29
  • 35
depperm
  • 10,606
  • 4
  • 43
  • 67
1

Using a list comprehension and itertools

import itertools    

d = [{'name': n, 'age': a, 'gender': g} for n, a, g in itertools.izip(name, age, gender)]
Brendan Abel
  • 35,343
  • 14
  • 88
  • 118
1

Use list comprehension.

In [3]: [{"name":n,"age":a,"gender":g} for n,a,g in zip(name, age, gender)]
Out[3]:
[{'age': 35, 'gender': 'Male', 'name': 'bob'},
 {'age': 12, 'gender': 'Female', 'name': 'kate'},
 {'age': 57, 'gender': 'Male', 'name': 'john'}]

or,

In [5]: [dict(zip(['name','age','gender'], t)) for t in zip(name, age, gender)]
Out[5]:
[{'age': 35, 'gender': 'Male', 'name': 'bob'},
 {'age': 12, 'gender': 'Female', 'name': 'kate'},
 {'age': 57, 'gender': 'Male', 'name': 'john'}]
Happy001
  • 6,103
  • 2
  • 23
  • 16
1

Go for this.

name = ['bob', 'kate', 'john']
age = [35, 12, 57]
gender = ["Male", "Female", "Male"]
keys = [name, age, gender] #If there are more data to be added just change this one place

def get_var_name(var):
    for k, v in list(globals().iteritems()):
        if v is var:
            return k

d = []
for i in range(len(keys[0])):
    d.append({})
    for key in keys:
       d[i][get_var_name(key)] = key[i] 

print d

Or use dict comprehension to avoid inner loop

d = []
for i in range(len(name)):
    d.append({get_var_name(key):key[i] for key in keys})
print d

To make it one liner go combining dict comprehension inner and list comprehension outer

print [{get_var_name(key):key[i] for key in keys} for i in range(len(keys[0]))]
nehem
  • 12,775
  • 6
  • 58
  • 84