production = {
'item1': '500',
'item2': '10000',
}
我试图从该dict中获取最高值,即10000。然而,我得到的是500作为返回的 max(production.values())
.
我相信之所以会这样,是因为它是从字符串中获取最高值,而不是int(取其码点的词法顺序)。
谁能帮我解决一下。谢谢
max()
需要一个键属性,你可以用它来转换数据进行计算。
production = {
'item1': '500',
'item2': '10000',
}
# base max calculation on integer version of value
max(production.values(), key=int) # assuming all are integers
# '10000'
这将保留你在字典中的值 - 所以返回的值将保持为一个字符串。
如果你也想要键,这也很方便。
max(production.items(), key=lambda pair: int(pair[1]))
# ('item2', '10000')
这不是你应该接受的答案,但可以提供一些性能方面的背景资料。
from random import randint
from timeit import timeit
# generating 1,000 dictionaries of random keys with random string values
dicts = [{k: str(randint(1, 10000)) for k in range(10000)} for _ in range(1000)]
def all_max1():
# the answer provided by @MarkMeyer
return [max(d.values(), key=int) for d in dicts]
def all_max2():
# the answer provided by @Marceline
return [max(int(x) for x in d.values()) for d in dicts]
print(timeit(all_max1, number=10))
print(timeit(all_max2, number=10))
@MarkMeyer提供的答案几乎是@Marceline提供的答案的两倍,尽管两者在技术上都是正确的。
结果是
7.4847795
11.341150599999999
@JHeron的建议是个好建议,如果你能避免在这个位置上出现字符串,使用整数会更有效率--但我假设你的数据是以字符串的形式出现的。
但是,如果你需要对这些值进行不止一次的操作(不仅仅是一个最大值),你可以考虑先转换原始数据,避免以后的多次转换。
你可以将它们转换为整数,并将最大值取出来
max(int(x) for x in production.values())
你得到这个输出是因为值是Strings.为了实现正确的max()比较,值必须是数字。
production = {
'item1': 500,
'item2': 10000,
}