对于重新发布的问题感到抱歉...我应该首先编辑此问题。为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]
但这并没有给我我想要的结果。
有什么想法吗?
谢谢!
答案 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
列表的最后一个元素。
(我不太确定这是你想要的)
修改强>:
如果您可以确保列表始终是整数列表(或数字类型,例如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]))
答案 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']