Python按值查询dict的属性

时间:2016-09-04 09:19:28

标签: python

我正在尝试在poi == true的dict中获取属性的数量。我已经包含了一个C#示例供参考,后面是我的python代码。

在Python中执行此操作的正确方法是什么?

C#:

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

在Python中:

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

enron_data示例:

{'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}}

4 个答案:

答案 0 :(得分:4)

假设poi总是TrueFalse,我可能会这样做。

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

enron_data.values()为您提供了一个返回字典值的迭代器。我们对钥匙不感兴趣。对于每一个,我们得到'poi'密钥的值。那就是

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

会给你。假设v['poi']总是TrueFalse,我会使用int()将其转换为整数。 int(True)1int(False)0。所以,如果我运行这个,我会得到一个10的列表。然后我sum整个列表,使用1内置来获取True s(即sum s)的计数。我放弃了[],因为我只是在列表上进行迭代而不是索引它或任何东西。

这是我想到的另一种选择。

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

答案 1 :(得分:2)

假设您有一个字典,其中每个值确实都有poi键(您的问题暗示):

enron_data = {'foo': {'poi': True}, 'bar': {'poi': False}}

然后,这将总结True条目的数量:

sum(1 if e['poi'] else 0 for e in enron_data.values())

答案 2 :(得分:0)

您可以使用iter_items()函数,如下所示:

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

OR

i = 0
for key,value in enron_data.iter_items():
    i += int(value["poi"])
print i

答案 3 :(得分:-1)

这是不对的,因为从来没有值[“poi”]有一个非假的值,我会增加1,所以你应该这样做:

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