2012-07-30 71 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