v0idation
v0idation

Reputation: 45

Create an array of items pulled from an array of dicts?

I have some output data in this format:

[{'state': 'OK', 'sname': 'sig1', 'extra': None}, {'state': 'OFF', 'sname': 'sig2', 'extra': None}, {'state': 'OK', 'sname': 'sig3', 'extra': None}, {'state': 'UNKNOWN', 'sname': 'sig4', 'extra': None}]

This data can contain any number of entries. What I want to do is pull out all the sname values into a list like this:

snames = ['sig1','sig2','sig3','sig4']

How can I iterate over the output without knowing its length in advance?

Upvotes: 3

Views: 63

Answers (3)

d6bels
d6bels

Reputation: 1482

The shortest and most pythonic is to use a list comprehension :

data =  [{'state': 'OK', 'sname': 'sig1', 'extra': None}, {'state': 'OFF', 'sname': 'sig2', 'extra': None}, {'state': 'OK', 'sname': 'sig3', 'extra': None}, {'state': 'UNKNOWN', 'sname': 'sig4', 'extra': None}]

snames = [i['sname'] for i in data if 'sname' in i]

print(snames)
>>> ['sig1', 'sig2', 'sig3', 'sig4']

It's better to verify that 'sname' is in your dict or you might get a KeyError unless you are sure about their consistency (you could get rid of if 'sname' in i in that case).

Upvotes: 2

SmCaterpillar
SmCaterpillar

Reputation: 7020

You can use list comprehension.

With

my_dict_list = [{'state': 'OK', 'sname': 'sig1', 'extra': None}, {'state': 'OFF', 'sname': 'sig2', 'extra': None}, {'state': 'OK', 'sname': 'sig3', 'extra': None}, {'state': 'UNKNOWN', 'sname': 'sig4', 'extra': None}]

You can get all 'sname' entries via:

my_list = [x['sname'] for x in my_dict_list]

and

print(my_list)

prints

['sig1', 'sig2', 'sig3', 'sig4']

Upvotes: 2

Anshul Goyal
Anshul Goyal

Reputation: 76907

You can use a list comprehension to do this:

In [1]: array_of_dicts = [{'state': 'OK', 'sname': 'sig1', 'extra': None}, {'state': 'OFF', 'sname': 'sig2', 'extra': None}, {'state': 'OK', 'sname': 'sig3', 'extra': None}, {'state': 'UNKNOWN', 'sname': 'sig4', 'extra': None}]

In [2]: snames = [d['sname'] for d in array_of_dicts]

In [3]: print snames
['sig1', 'sig2', 'sig3', 'sig4']

Upvotes: 3

Related Questions