列表字典中的Python最小值

时间:2012-07-30 21:13:11

标签: python list dictionary max minimum

对于重新发布的问题感到抱歉...我应该首先编辑此问题。为mods标记了新的。对不起,麻烦

由于需求变更,不得不重写问题。

我有一本字典如下:

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]

但这并没有给我我想要的结果。

有什么想法吗?

谢谢!

4 个答案:

答案 0 :(得分: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()来查找最长的值。

答案 1 :(得分: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蒙上阴影。

答案 2 :(得分: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列表的最后一个元素。

(我不太确定这是你想要的)

修改

如果您可以确保列表始终是整数列表(或数字类型,例如longfloat ...),则无需投射字符串到整数。 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]))

答案 3 :(得分:0)

我找到了一个如此简单的解决方案:

min_len = len(min(d.values(), key=(lambda value: len(value))))  # 1
min_keys = [key for i, key in enumerate(d) if len(d[key]) == min_len]  # ['e', 'f', 'g']