3

I have the following data in my list of dictionary:

data = [{'I-versicolor': 0, 'Sepal_Length': '7.9', 'I-setosa': 0, 'I-virginica': 1},
{'I-versicolor': 0, 'I-setosa': 1, 'I-virginica': 0, 'Sepal_Width': '4.2'},
{'I-versicolor': 2, 'Petal_Length': '3.5', 'I-setosa': 0, 'I-virginica': 0},
{'I-versicolor': 1.2, 'Petal_Width': '1.2', 'I-setosa': 0, 'I-virginica': 0}]

And to get a list based upon a key and value I am using the following:

next((item for item in data if item["Sepal_Length"] == "7.9"))

However, all the dictionary doesn't contain the key Sepal_Length, I am getting :

KeyError: 'Sepal_Length'

How can i solve this?

Clint Whaley
  • 459
  • 2
  • 7
  • 18
  • 1
    This question makes me think `list.index` should take an optional `key`, like `list.sort`, to use as a predicate... – Claudiu Feb 17 '16 at 01:44
  • @Claudiu -- That's an interesting thought. I use this `next` idiom pretty frequently, but it has some quarks (e.g. supplying a default value if you aren't sure that a match will be found) – mgilson Feb 17 '16 at 01:46

1 Answers1

7

You can use dict.get to get the value:

next((item for item in data if item.get("Sepal_Length") == "7.9"))

dict.get is like dict.__getitem__ except that it returns None (or some other default value if provided) if the key is not present.


Just as a bonus, you don't actually need the extra parenthesis here around the generator expression:

# Look mom, no extra parenthesis!  :-)
next(item for item in data if item.get("Sepal_Length") == "7.9")

but they help if you want to specify a default:

next((item for item in data if item.get("Sepal_Length") == "7.9"), default)
mgilson
  • 300,191
  • 65
  • 633
  • 696