列表字典中的Python最小值

Posted

技术标签:

【中文标题】列表字典中的Python最小值【英文标题】:Python miminum value in dictionary of lists 【发布时间】:2012-07-28 14:28:45 【问题描述】:

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

由于需求变化,不得不重新编写问题。

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

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]

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

有什么想法吗?

谢谢!

【问题讨论】:

包含多个项目的值的“价值”是什么。 ['1', '2'] 是否大于 ['1']?您是通过长度还是通过平均每个列表中的值来衡量“价值”? 将变量命名为“dict”通常是个坏主意,因为它是一种类型 在这种情况下,值是通过列表的长度来衡量的,而不是列表中的数字本身。 一种奇怪的家庭作业要求 恢复到原始版本。从本质上删除问题会使它对未来的读者完全无用。 【参考方案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() 来查找最长的值。

【讨论】:

出于某种原因,当我在我的字典中尝试 min_value 时,其中有大约 20 个长度相同的列表,它只给了我一个列表,这也是错误的列表。 .. 请解释一下您的意思。 min() 只会返回一个值;这就是为什么我也有min_list,它收集了所有具有该值的键。另外,我刚刚编写了这段代码让min() 进行默认比较。如果您想要一些不同的比较,请说明您想要的是什么。【参考方案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 第二个min是多余的 min_value 返回的列表不正确,不是最小值 @user1530318 谢谢,你完全正确。事实证明,第二个min 毕竟不是多余的。【参考方案3】:

使用排序和 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]))

【讨论】:

【参考方案4】:

我找到了这么简单的解决方案:

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

【讨论】:

以上是关于列表字典中的Python最小值的主要内容,如果未能解决你的问题,请参考以下文章

如何从从excel文件派生的大量字典中的值列表中查找最小值和最大值

在字典中找到列表的最小值[关闭]

在列表中查找具有值的最小字典键的 Pythonic 方法?

从python中的字典中提取最大值和最小值

在包含字典的列表中获取最小值(键,值)

Python:从字典中获取具有最小值但有多个最小值的键