簡體   English   中英

從 dicts 的 dict 創建一個內部值列表

[英]Create a list of an inner value from a dict of dicts

我試圖找出 dict 的dict的內部值的最大值和最小值。

dict看起來像這樣:

{'ALLEN PHILLIP K': {'bonus': 4175000,
                     'exercised_stock_options': 1729541,
                     'expenses': 13868},
 'BADUM JAMES P': {'bonus': 'NaN',
                   'exercised_stock_options': 257817,
                   'expenses': 3486},
 ...
}

我想找出所有字典中的最小和最大exercised_stock_options _股票選項。

我嘗試使用 Pandas 來執行此操作,但找不到適當調整數據的方法。 然后,我在 Python 中嘗試了一個簡單的 for 循環。 我的 for 循環代碼不起作用,我不知道為什么( data_dict的 dict 稱為data_dict ):

stock_options=[]
for person in range(len(data_dict)):
    stock_options.append(data_dict[person]['exercised_stock_options'])
print stock_options

然后我要取列表的最大值和最小值。

知道為什么此代碼不起作用嗎? 任何用於計算 dicts 的內部值的最大值和最小值的替代方法?

這里有一個方法,它使用列表exercised_stock_options從每個字典中獲取excured_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)

您正在使用 range 來獲取主詞典的索引號。 您真正應該做的是獲取字典的鍵而不是索引。 也就是說,person 是每個人的名字。 因此,當person == 'ALLEN PHILLIP K' PHILLIP person == 'ALLEN PHILLIP K' datadict[person] 現在獲取該鍵的字典。

請注意, 使用 items() 遍歷字典表示最好使用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 循環中定義兩個變量並調用字典上的 items() 時,Python 會自動將第一個變量指定為該字典中鍵的名稱,將第二個變量指定為該鍵的對應值。

 d = {"first_name": "Alfred", "last_name":"Hitchcock"} for key,val in d.items(): print("{} = {}".format(key, val))

Python 2 和 Python 3 的區別

在 python 2.x 中,上面使用 items 的例子將返回一個包含字典的復制鍵值對的元組列表。 為了不復制並將列表中的整個字典的鍵和值加載到內存中,您應該更喜歡 iteritems 方法,它只返回一個迭代器而不是一個列表。 在 Python 3.x 中, iteritems 被移除,items 方法返回視圖對象。 與包含副本的元組相比,這些視圖對象的好處是對字典所做的每個更改都會反映在視圖對象中。

您需要迭代您的字典.values()並返回“exercised_stock_options”的值。 您可以使用簡單的列表推導來檢索這些值

>>> values = [value['exercised_stock_options'] for value in d.values()]
>>> values
[257817, 1729541]
>>> min(values)
257817
>>> max(values)
1729541

幾周前我發布了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),
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM