我试图找出dict
s的字典内部值的最大值和最小值。
dict
看起来像这样:
{'ALLEN PHILLIP K': {'bonus': 4175000,
'deferral_payments': 2869717,
'deferred_income': -3081055,
'director_fees': 'NaN',
'email_address': 'phillip.allen@enron.com',
'exercised_stock_options': 1729541,
'expenses': 13868,
'from_messages': 2195,
'from_poi_to_this_person': 47,
'from_this_person_to_poi': 65,
'loan_advances': 'NaN',
'long_term_incentive': 304805,
'other': 152,
'poi': False,
'restricted_stock': 126027,
'restricted_stock_deferred': -126027,
'salary': 201955,
'shared_receipt_with_poi': 1407,
'to_messages': 2902,
'total_payments': 4484442,
'total_stock_value': 1729541},
'BADUM JAMES P': {'bonus': 'NaN',
'deferral_payments': 178980,
'deferred_income': 'NaN',
'director_fees': 'NaN',
'email_address': 'NaN',
'exercised_stock_options': 257817,
'expenses': 3486,
'from_messages': 'NaN',
'from_poi_to_this_person': 'NaN',
'from_this_person_to_poi': 'NaN',
'loan_advances': 'NaN',
'long_term_incentive': 'NaN',
'other': 'NaN',
'poi': False,
'restricted_stock': 'NaN',
'restricted_stock_deferred': 'NaN',
'salary': 'NaN',
'shared_receipt_with_poi': 'NaN',
'to_messages': 'NaN',
'total_payments': 182466,
'total_stock_value': 257817},
}
我想弄清楚所有词典中的最小值和最大值exercised_stock_options
。
我尝试使用Pandas来做到这一点,但无法找到适当塑造数据的方法。然后,我在python中尝试了一个简单的for循环。我的for-loop代码不起作用,我无法弄清楚为什么(dicts的字典被称为data_dict
):
stock_options=[]
for person in range(len(data_dict)):
stock_options.append(data_dict[person]['exercised_stock_options'])
print stock_options
然后我将获取列表的最大值和最小值。
知道为什么这段代码不起作用?用于计算dicts字典内部值的最大值和最小值的任何替代方法?
答案 0 :(得分:3)
这是一种方法,它使用列表推导从每个字典中获取exercised_stock_options
,然后从数据中打印出最小值和最大值。忽略示例数据,您可以根据需要对其进行修改。
d = {'John Smith':{'exercised_stock_options':99},
'Roger Park':{'exercised_stock_options':50},
'Tim Rogers':{'exercised_stock_options':10}}
data = [d[person]['exercised_stock_options'] for person in d]
print min(data), max(data)
答案 1 :(得分:2)
您正在使用范围来获取主词典的索引号。你真正应该做的是获取字典的键而不是索引。也就是说,人是每个人的名字。因此,当person == 'ALLEN PHILLIP K'
datadict [person]现在获取该密钥的字典时。
请注意,Use items() to iterate across dictionary表示最好使用d, v = data_dict.items()
而不是循环字典本身。另请注意Python 2和Python 3之间的区别。
people=[]
stock_options=[]
for person, stock_data in data_dict.items():
people.append(person)
stock_options.append(stock_data['exercised_stock_options'])
# This lets you keep track of the people as well for future use
print stock_options
mymin = min(stock_options)
mymax = max(stock_options)
# process min and max values.
<强>最佳实践强>
使用items()迭代字典
下面的更新代码演示了用于迭代的Pythonic样式 通过字典。在for循环中定义两个变量时 在字典Python上调用items() 自动将第一个变量指定为其中的键名 字典,第二个变量作为对应的值 那把钥匙。
d = {"first_name": "Alfred", "last_name":"Hitchcock"} for key,val in d.items(): print("{} = {}".format(key, val))
差异Python 2和Python 3
在python 2.x中,使用item的上述示例将返回一个列表 包含字典的复制键值对的元组。在 为了不复制和加载整个字典的键和 列表中的值到内存中你应该更喜欢iteritems 简单地返回迭代器而不是列表的方法。在Python中 3.x删除了iteritems,items方法返回视图对象。与元组相比,这些视图对象的好处 包含副本的是对字典所做的每个更改 反映在视图对象中。
答案 2 :(得分:0)
您需要迭代字典.values()
并返回“exercised_stock_options”的值。您可以使用简单的列表推导来检索这些值
>>> values = [value['exercised_stock_options'] for value in d.values()]
>>> values
[257817, 1729541]
>>> min(values)
257817
>>> max(values)
1729541
答案 3 :(得分:0)
以下是使用lifter的答案:
from lifter.models import Model
# We create a model representing our data
Person = Model('Person')
# We convert your data to a regular iterable
iterable = []
for name, data in your_data.items():
data['name'] = name
iterable.append(data)
# we load this into lifter
manager = Person.load(iterable)
# We query the data
results = manager.aggregate(
(Person.exercised_stock_options, min),
(Person.exercised_stock_options, max),
)
使用列表推导当然可以获得相同的结果,但是,使用专用库有时会很方便,特别是如果您想在获取结果之前使用复杂查询过滤数据。例如,您只能为费用低于10000的人获取最小值和最大值:
# We filter the data
queryset = manager.filter(Person.expenses < 10000)
# we apply our aggregate on the filtered queryset
results = queryset.aggregate(
(Person.exercised_stock_options, min),
(Person.exercised_stock_options, max),
)