Python字典列表中的最小值

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]

但是这不能给我想要的结果。 有什么想法吗? 谢谢!

2
一个包含多个项的值的“价值”是什么?['1', '2']是否大于['1']?您是通过长度还是通过每个列表中的值的平均值来衡量“价值”的? - Joel Cornett
2
通常不建议将变量命名为“dict”,因为它是一种类型。 - inspectorG4dget
在这种情况下,价值是由列表的长度来衡量的,而不是列表中的数字本身。 - user1530318
有点奇怪的作业要求 - John La Rooy
1
回滚到原始版本。实质上删除问题会使其对未来读者完全无用。 - Lev Levitsky
4个回答

2

你的问题在于你的列表包含字符串('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


这些值是字符串列表。这将导致 TypeError 错误。 - inspectorG4dget
第二个 min 是多余的。 - inspectorG4dget
min_value 返回一个不正确的列表,该列表不是最小值。 - user1530318
@user1530318 谢谢,你说得完全正确。事实证明第二个 min 并不是多余的。 - phihag

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(),来查找最长的值。


由于某种原因,当我在包含大约20个相同长度列表的字典上尝试使用min_value时,它只给出了一个列表,而且还是错误的列表... - user1530318
请解释您的意思。min()只会返回一个值;这就是为什么我还有min_list,它收集所有具有该值的键。此外,我刚刚编写了这段代码,让min()执行其默认比较。如果您想要一些不同的比较,请解释您想要的是什么。 - steveha

1

使用排序和lambda表达式怎么样?

#!/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]))

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']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接