列表字典中的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
列表的最后一个元素。
(不过我不太确定这是你想要的)
编辑:
如果您可以确保列表始终是整数列表(或数字类型,例如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]))
【讨论】:
【参考方案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最小值的主要内容,如果未能解决你的问题,请参考以下文章