什麼我承認我不是你要找的內容在這裏100%清楚,但我給它一個鏡頭:
一個好的策略當你想迭代一個「事物」列表並且積累關於「同類事物」的某種信息時,就是使用一個散列表。在Python中,我們通常對需要散列表的算法使用dict
。
收集足夠的信息來獲得的平均價格爲每個項目在列表中,我們需要:
一)與特定項目的總數「計數」
B)總與具體項目的價格「計數」
所以,讓我們建立一個「計數」可以映射到包含「總項目」和「總價格」與「數」的項目一個字典的數據結構。
讓我們把我們的輸入格式爲:
item_list = [
{'count': 3.5, 'price': 2500},
{'count': 3, 'price': 400},
{'count': 2, 'price': 3000},
{'count': 3.5, 'price': 750},
{'count': 2, 'price': 500},
]
現在讓我們地圖關於「總項目」和「總價」在dict
稱爲items_by_count
的信息:
for item in item_list:
count, price = item['count'], item['price']
items_by_count[count]['total_items'] += 1
items_by_count[count]['total_price'] += price
別急!items_by_count[count]
將拋出一個KeyError
如果count
是不是已經在字典。 defaultdict
這是一個很好的用例。讓我們來定義我們以前從未見過的0總價0總項count
的默認值,並且:
from collections import defaultdict
items_by_count = defaultdict(lambda: {
'total_items': 0,
'total_price': 0
})
現在我們的代碼就不會在每次我們看到了一個新的值時拋出一個異常count
。
最後,我們需要採取實際平均值。讓我們在另一個dict
中獲取我們需要的信息,將計數映射到平均價格。這是一個很好的用例的dict comprehension:
{count: item['total_price']/item['total_items']
for count, item in items_by_count.iteritems()}
這種迭代的items_by_count
字典,並建立了我們需要新的字典。
全部放在一起:
from collections import defaultdict
def get_average_price(item_list):
items_by_count = defaultdict(lambda: {
'total_items': 0,
'total_price': 0
})
for item in item_list:
count, price = item['count'], item['price']
items_by_count[count]['total_items'] += 1
items_by_count[count]['total_price'] += price
return {count: item['total_price']/item['total_items']
for count, item in items_by_count.iteritems()}
如果我們通過在我們的例子輸入字典,這個函數返回: {3.5: 1625, 2: 1750, 3: 400}
這是希望你想要的輸出!在您特定的Python版本中謹慎處理諸如float division的問題。
「字典」標籤看起來像一個好的開始 - 你到目前爲止嘗試過什麼? – KernelPanic
簡單的代碼!覺得有點難,你會做到這一點! :) – phunsukwangdu
如果只有一個函數可以通過**共享密鑰** **項目**!哦,等等,[這是!](https://docs.python.org/3/library/itertools.html?highlight=groupby#itertools.groupby) –