Johnny Grimes Johnny Grimes - 3 months ago 7
Python Question

Python Query properties of dict by value

I'm trying to get the count of properties in a dict where poi == true. I've included a C# example for reference, followed by my python code.

What's the correct way of doing this in Python?

C#:

enron_data.where(x => x.poi == true).count()


In Python:

i = 0
for key,value in enron_data.items():
if value["poi"]:
i = i + 1
print i


enron_data Sample:

{'METTS MARK': {'salary': 365788, 'to_messages': 807, 'deferral_payments': 'NaN', 'total_payments': 1061827, 'exercised_stock_options': 'NaN', 'bonus': 600000, 'restricted_stock': 585062, 'shared_receipt_with_poi': 702, 'restricted_stock_deferred': 'NaN', 'total_stock_value': 585062, 'expenses': 94299, 'loan_advances': 'NaN', 'from_messages': 29, 'other': 1740, 'from_this_person_to_poi': 1, 'poi': False, 'director_fees': 'NaN', 'deferred_income': 'NaN', 'long_term_incentive': 'NaN', 'email_address': 'mark.metts@enron.com', 'from_poi_to_this_person': 38}}

Answer

I'd probably do something like this assuming that the poi is always True or False.

sum(int(v['poi']) for v in enron_data.values())

enron_data.values() gives you an iterator that will return values of the dictionary. We're not interested in the keys. For each one, we get the value of the 'poi' key. That's what

[v['poi'] for v in enron_data.values()]

will give you. Assuming that v['poi'] is always True or False, I convert it to an integer using int(). int(True) is 1 and int(False) is 0. So, if I run this, I will get a list of 1s and 0s. Then I sum the entire list to get the count of 1s (i.e. Trues) using the sum builtin. I drop the [ and ] because I'm just going to iterate over the list and not index it or anything.

Here's another alternative that occurred to me.

sum(1 for v in enron_data.values() if v['poi'] is True)
Comments