从dicts的dict创建内部值列表

时间:2016-03-28 16:37:50

标签: python dictionary

我试图找出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字典内部值的最大值和最小值的任何替代方法?

4 个答案:

答案 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这些任务,我想你可能会觉得它很有用。 这里唯一的问题是你有一个映射(dicts的dict)而不是一个常规的iterable。

以下是使用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),
)