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?

2
  • 1
    This question makes me think list.index should take an optional key, like list.sort, to use as a predicate... Commented Feb 17, 2016 at 1: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) Commented Feb 17, 2016 at 1:46

1 Answer 1

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)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.