2017-02-18 103 views
1

發現的價值平均,我有以下列表Python字典 - 從其他值

count = 3.5, price = 2500 

count = 3, price = 400 

count = 2, price = 3000 

count = 3.5, price = 750 

count = 2, price = 500 

我想找到的平均價格都在數是一樣的。例如:

count = 2, price = 3000 

count = 2, price = 500 

3000 + 500 = 3500 

3500/2 = 1750 

平均爲 '計數2' 是1750

這裏是我到目前爲止的代碼

avg_list = [value["average"] for value in dictionary_database_list] 

counter_obj = collections.Counter(count_list) 

print ("AVG:") 

for i in counter_obj: 

    print (i, counter_obj[i]) 
+0

「字典」標籤看起來像一個好的開始 - 你到目前爲止嘗試過什麼? – KernelPanic

+2

簡單的代碼!覺得有點難,你會做到這一點! :) – phunsukwangdu

+1

如果只有一個函數可以通過**共享密鑰** **項目**!哦,等等,[這是!](https://docs.python.org/3/library/itertools.html?highlight=groupby#itertools.groupby) –

回答

1

什麼我承認我不是你要找的內容在這裏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的問題。

+1

這正是我一直在尋找和它工作完美!你真棒! – user7583486

-2

您需要遍歷您的項目

See documentation

  • avg(dictionary.values())可能是你想要
+0

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的基本部分並提供參考鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/15253408) –

+0

我雖然可以幫助只發佈一個方法,因爲@ phunsukwangdu評論,然後upvoted我也是。 '簡單的代碼'。 PD:我從python官方文檔發佈了一個永久鏈接。改變可能發生,但刪除一個如此常見的方法... idts –

+0

我仍然很迷失這一個...不知道如何實現avg(dictionary.values()) – user7583486