从数字字典中获取最高值作为字符串

ank*_*nkh -1 python dictionary max

production = {
        'item1': '500',
        'item2': '10000',
    }
Run Code Online (Sandbox Code Playgroud)

我试图从该 dict 中获得最高值,即 10000。但是,我得到 500 作为max(production.values()).

我相信它是这样的,因为它从 string 中获得最高值,而不是 int (采用其代码点的字典顺序)。

有人可以帮我解决一个问题。谢谢!

Mar*_*yer 6

max()采用一个关键属性,您可以使用它来转换计算数据:

\n\n
production = {\n    \'item1\': \'500\',\n    \'item2\': \'10000\',\n}\n\n# base max calculation on integer version of value\nmax(production.values(), key=int) # assuming all are integers\n# \'10000\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将保留字典 \xe2\x80\x94 中的值,因此返回的值将保留为字符串。

\n\n

如果您也想要密钥,这也很方便:

\n\n
max(production.items(), key=lambda pair: int(pair[1]))\n# (\'item2\', \'10000\')\n
Run Code Online (Sandbox Code Playgroud)\n


Gri*_*mar 5

不是您应该接受的答案,而是提供一些有关性能的背景:

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))
Run Code Online (Sandbox Code Playgroud)

@MarkMeyer 提供的答案几乎是 @Marceline 提供的答案的两倍,尽管两者在技术上都是正确的。

结果:

7.4847795
11.341150599999999
Run Code Online (Sandbox Code Playgroud)

@JHeron 的建议是很好的建议,因为如果您可以首先避免在该位置使用字符串,则使用整数会更有效 - 但我假设您的数据以字符串的形式出现。

但是,如果您需要对这些值进行多次操作(不仅仅是单个最大值),您可以考虑先转换原始数据,然后避免多次转换。