2012-07-30 105 views
2

對於轉發問題抱歉...我應該首先編輯此問題。標記爲mods新的一個。對不起,我的問題列表字典中的Python miminum值

由於需求改變,不得不重新編寫問題。

我有一本字典,如下列:

d = {'a': [4, 2], 'b': [3, 4], 'c': [4, 3], 'd': [4, 3], 'e': [4], 'f': [4], 'g': [4]} 

我想獲取與字典中的d最小長度,以及那些具有最大值相關聯的密鑰。

在這種情況下,具有最小長度(在本詞典列出的最小長度)的按鍵應該返回

'e, 'f', 'g' 

而那些最值(每個列表中的整數的總和)應該返回

'b' 'c' 

我已經試過

min_value = min(dict.itervalues()) 
min_keys = [k for k in d if dict[k] == min_value] 

但是,這並沒有給我的我想要的結果。

任何想法?

謝謝!

+2

什麼是包含多個項目的值的「值」。 '['1','2']'是否大於'['1']'?你是用長度衡量'價值'還是通過平均每個清單中的價值? – 2012-07-30 21:19:30

+2

通常是一個壞主意,因爲它是一個類型 – inspectorG4dget 2012-07-30 21:20:13

+0

變量名稱的變量是「dict」,在這種情況下,值是通過列表長度來衡量的,而不是列表中的數字本身。 – user1530318 2012-07-30 21:36:50

回答

1

您可以使用min()key=參數,並指定一個按您想要的方式進行比較的關鍵函數。

d = {'a': ['1'], 'b': ['1', '2'], 'c': ['2'], 'd':['1']} 

min_value = min(d.values()) 
min_list = [key for key, value in d.items() if value == min_value] 
max_len = len(max(d.values(), key=len)) 
long_list = [key for key, value in d.items() if len(value) == max_len] 

print(min_list) 
print(long_list) 

注:

0)不要使用dict作爲變量名;這就是字典類的名稱,如果你用它作爲變量名,你就會「隱藏」它。我在這裏使用d作爲名字。

1)min_value很容易;不需要使用key=函數。

2)max_len使用key=函數len()來查找最長的值。

+0

抱歉,當我嘗試使用我的字典中的min_value時,它裏面有20個列表,它們的長度相同,它只給出一個列表,這也是錯誤列表... – user1530318 2012-07-30 21:31:22

+0

請解釋你的意思。 'min()'只會返回一個值;這就是爲什麼我也有'min_list',它收集所有具有該值的鍵。另外,我只寫了這段代碼讓'min()'做它的默認比較。如果你需要一些不同的比較,請解釋你想要的是什麼。 – steveha 2012-07-30 22:45:06

1

您的問題是您的列表包含字符串('2'),而不是整數(2)。離開了引號,或使用以下命令:

min_value = min(min(map(int, v) for v in dct.values())) 
min_keys = [k for k,v in d.items() if min_value in map(int, v)] 

相若方式,計算與最大長度的密鑰:

max_length = max(map(len, dct.values())) 
maxlen_keys = [k for k,v in d.items() if max_length == len(v)] 

而且,這是一個壞主意,用dict作爲變量名,如這樣做會掩蓋內置的dict

+0

這些值是字符串列表。這將產生一個'TypeError' – inspectorG4dget 2012-07-30 21:17:36

+0

第二'min'是多餘的 – inspectorG4dget 2012-07-30 21:22:49

+0

min_keys返回一個[] – user1530318 2012-07-30 21:35:38

1

如何使用排序和lambdas?

#!/usr/bin/env python 
d = {'a': ['1'], 'b': ['1', '2'], 'c': ['8', '1'], 'd':['1'], 'e':['1', '2', '3'], 'f': [4, 1]} 
sorted_by_sum_d = sorted(d, key=lambda key: sum(list(int(item) for item in d[key]))) 
sorted_by_length_d = sorted(d, key=lambda key: len(d[key])) 
print "Sorted by sum of the items in the list : %s" % sorted_by_sum_d 
print "Sorted by length of the items in the list : %s" % sorted_by_length_d 

這將輸出:

Sorted by sum of the items in the list : ['a', 'd', 'b', 'f', 'e', 'c'] 
Sorted by length of the items in the list : ['a', 'd', 'c', 'b', 'f', 'e'] 

要知道,我改變了最初的'd'詞典(只是爲了確保它是工作)

然後,如果你想用最大的總和的項目,您將獲得sorted_by_sum_d列表的最後一個元素。

(我不太清楚這是你想要什麼,雖然)

編輯

如果你能保證列表總是將是整數(或數字類型列表,就此而言,例如long,float ...),則不需要將字符串轉換爲整數。 sorted_by_sum_d變量的計算可以簡單地使用:

d = {'a': [1], 'b': [1, 2], 'c': [8, 1], 'd':[1], 'e':[1, 2, 3], 'f': [4, 1]} 
sorted_by_sum_d = sorted(d, key=lambda key: sum(d[key])) 
+0

如果這些數字不是字符串,而是整數,這種方式會起作用嗎? – user1530318 2012-07-30 22:42:44

+0

請參閱編輯問題**:)** – BorrajaX 2012-07-30 22:51:02