user3739661
user3739661

Reputation: 13

Making a list of dictionaries from a list of tuples

I'm a Python newbie. As a fun exercise, I thought I would create a list of dictionaries from a list of tuples. Little did I know I would bang my head against the wall for hours.

boys = [("Joe", 7, 125), ("Sam", 8, 130), ("Jake", 9, 225)]
keys = ("Name","Height","Weight")
boyz = []
for x in boys:
    z = dict(zip(keys,boys[x]))
    boyz.append(z)
print(boyz)

When the x in "boys[x]" is replaced with a integer, it works great, but replacing it with a variable within the for loop won't work. WHY?? I'd love an answer to that specifically. But also if there's a more concise to write this whole thing, please let me know.

Upvotes: 1

Views: 84

Answers (4)

Nagasaki45
Nagasaki45

Reputation: 2850

A more concise version, as you asked, can be achieved using list comprehension.

boyz = [dict(zip(keys, boy)) for boy in boys]

Generally, when you see the pattern of creating an empty list, iterating over some iterable and appending its values after map / filtering, you can use a list comprehension instead.

This:

new_list = []
for item in iterable:
    if condition(item):
        new_value = mapping(item)
        new_list.append(new_value)

Is equivalent to:

new_list = [mapping(item) for item in iterable if condition(item)]

Upvotes: 0

RohitJ
RohitJ

Reputation: 563

boys is a list. lists only support indices that are integers but you're passing in a tuple. You'll want to use x as the tuple.

Ultimately, your goal is to get an iterable of keys and values to pass in to zip.

dict(zip(keys, values))

Upvotes: 0

A.J. Uppal
A.J. Uppal

Reputation: 19264

You are using boys[x] instead of x.

This raises the error:

TypeError: list indices must be integers, not tuple

Here is your edited code:

boys = [("Joe", 7, 125), ("Sam", 8, 130), ("Jake", 9, 225)]
keys = ("Name","Height","Weight")
boyz = []
for x in boys:
    z = dict(zip(keys,x))
    boyz.append(z)

print(boyz)

This runs as:

>>> boys = [("Joe", 7, 125), ("Sam", 8, 130), ("Jake", 9, 225)]
>>> keys = ("Name","Height","Weight")
>>> boyz = []
>>> for x in boys:
...     z = dict(zip(keys,x))
...     boyz.append(z)
... 
>>> print(boyz)
[{'Name': 'Joe', 'Weight': 125, 'Height': 7}, {'Name': 'Sam', 'Weight': 130, 'Height': 8}, {'Name': 'Jake', 'Weight': 225, 'Height': 9}]
>>> 

Upvotes: 1

Tim
Tim

Reputation: 12174

In each iteration of the for x in boys loop, x will be the value of the next tuple in the list. It is not an integer you can use as an index. Use x instead of boys[x] in the zip to get the result you want.

for x in boys:
    z = dict(zip(keys,x))
    boyz.append(z)

Upvotes: 2

Related Questions