仅从字典

时间:2016-04-12 21:30:22

标签: python list dictionary tuples

我正在翻阅一本字典,其中以总统的名字作为我字典的关键字,以及一个元组,其中包含年份开始,服务年限,学期开始时的年龄以及他们来自哪个州。在这种情况下,我只是看看他们为此开始任期的年龄。 dictonary的样本:

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_start_term变量之后放置像youngest = min(age_start_term)这样的东西,但这只会检查那一次迭代。所以我想我都希望得到最小的比较,然后打印一个列表,其中包含与词典中表示的最年轻年龄一致的键。 为什么我可以添加到我所拥有的内容中,以便在迭代后将其与所有年龄段进行比较?为了获得与字典中最年轻的年龄相对应的键,我可以沿着这些方向做点什么吗?

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

4 个答案:

答案 0 :(得分:6)

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]

答案 1 :(得分:2)

实现它的功能性方法:

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))

答案 2 :(得分:0)

诱惑是使用min,但这需要至少迭代一次列表,然后你还需要在术语开始时建立一些年龄指数。一个更好的选择是在总统的初始阶段建立一个年龄字典,并在你建立时跟踪最小年龄。然后,您只需要引用与该索引匹配的条目。

import collections

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

bday_dict = collections.defaultdict(list)

min_age = 1000
for key, value in pres_data.items():
    age_start_term = value[2]
    if age_start_term < min_age:
        min_age = age_start_term

    bday_dict[age_start_term].append(key)

print(min_age, bday_dict[min_age])
# 64 ['LizardKing', 'Bush']

答案 3 :(得分:0)

这个怎么样?

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