4

抱歉问题重新发布......我应该首先编辑这个问题。为模组标记了新的。抱歉,添麻烦了

由于要求更改,不得不重新编写问题。

我有一本字典,如下所示:

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

4 回答 4

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]))
于 2012-07-30T22:35:38.210 回答
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()来找到最长的值。

于 2012-07-30T21:15:58.107 回答
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.

于 2012-07-30T21:16:02.597 回答
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']
于 2021-06-16T07:53:05.040 回答