从字典中获得最小值

2024-05-16 10:04:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我在反复翻阅一本词典,词典的关键是总统的名字,还有一个元组,包含就职年份、任职年限、任期开始时的年龄以及他们来自哪个州。在这个例子中,我只是看看他们开始这个学期的年龄。口述的例子:

pres_data={"Reagan": (1981, 8, 69,"California"), "Bush":(1989, 4,64,"Texas")}

这本词典通读了更多的总统和以上类似的数据,但我不包括它,因为在这里放太多了。你知道吗

我想要的结果是:

(64,["George Bush"])

所以它将首先显示最小年龄(我假设它将使用min()函数来获取,但它在我的设置中还没有起作用),然后是一个共享字典中最小年龄的总统名字列表。你知道吗

到目前为止我的代码是:

pres_data={"Reagan": (1981, 8, 69,"California"), "Bush":(1989,4,64,"Texas")}
for key, value in pres_data.items():
    age_start_term=value[2]
    print(age_start_term,key)

我在考虑在age\u start\u term变量之后放置一些像minest=min(age\u start\u term)这样的内容,但这只会检查一次迭代。所以我想我是在寻找一个最小的比较发生,并打印一个列表,其中包含的关键字,以及字典中表示的最年轻的年龄。 我可以在我拥有的东西上添加什么来让它在我遍历之后比较所有的年龄?为了得到字典中最年轻年龄对应的键,我能做些类似的事情吗?你知道吗

allyoungest= [k for k in pres_data if pres_data[k] == #variable representing youngest]

Tags: agedata字典名字start例子词典总统
3条回答

min函数接受一个名为key的参数,您可以使用该参数从要比较的项中提取比较键。在您的情况下,类似于:

youngest = min(pres_data.items(), key=lambda item: item[1][2])

这将为您提供:

('Bush', (1989, 4, 64, 'Texas'))

你应该可以把它转换成你想要的任何输出格式。你知道吗

如果你想要一份所有具有相同最低年龄的总统的名单,你可以再做一次,就像你猜测的那样:

min_age = youngest[1][2]
all_youngest = [name for name in pres_data if pres_data[name][2] == min_age]

这个怎么样?你知道吗

sorted(pres_data.items(), key= lambda x: x[1][2])[0]

一种实用的方法:

from functools import reduce

pres_data = {"Reagan": (1981, 8, 69,"California"), "Bush":(1989,4,64,"Texas")}

def min_pres(acc, it):
    min_age, presidents = acc
    name, (year, served, age, state) = it

    if min_age is None or age < min_age:
        return (age, [name])

    elif age == min_age:
        presidents.append(name)

    return acc

reduce(min_pres, pres_data.items(), (None, None))

相关问题 更多 >