使用递归查找嵌套dict的值并返回di的键

2024-04-26 05:44:24 发布

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

我有一个练习,其中生日字典如下:

    birthdays = 
    {"Anne": {"month":"Jan","day":"27"},
    "Mike":{"month":"Feb","day":"13"},
    "Nicolas":{"month":"Jun","day":14}, 
    "Marta": {"month":"Jan","day":16}}

问题是要定义一个函数,给定一个月,它将打印一个包含该月所有有生日的人的列表,以及日期。你知道吗

到目前为止我得到的是:

    def birthbymonth(book, month):
        for k,v in book.items():
            if isinstance(v, dict):
                birthbymonth(v,month)           
            else:
                if month == v:
                    print(book)

当被称为birthdbymonth(生日,“Jan”)时,打印:

    {'month': 'Jan', 'day': '27'}
    {'month': 'Jan', 'day': 16}

但是我不知道怎么把那些过生日的人的名字也打印出来。你知道吗


Tags: if字典定义junjanfebmikenicolas
3条回答

如果您真的想使用递归(不建议用于此问题),可以对现有代码进行一些修改:

birthdays = {
    "Anne": {"month":"Jan","day":27},
    "Mike": {"month":"Feb","day":13},
    "Nicolas": {"month":"Jun","day":14},
    "Marta": {"month":"Jan","day":16}
}

def birthbymonth(book, month):
    names = []
    for k,v in book.items():
        if isinstance(v, dict):
            names += [(k, book[k]["day"])] if birthbymonth(v,month) is True else []
        else:
            if month == v:
                return True
    return names

print(birthbymonth(birthdays, 'Jan'))
#[('Marta', 16), ('Anne', 27)]

我看不出有什么理由在这里使用递归。你知道吗

def birthbymonth(book, month):
    for person,birthday in book.items():
        if birthday['month'] == month:
            print('{}: {} {}'.format(person, birthday['month'], birthday['day']))

正如其他人所指出的,不需要递归。相反,使用列表理解:

birthdays = {"Anne": {"month":"Jan","day":"27"},
"Mike":{"month":"Feb","day":"13"},
"Nicolas":{"month":"Jun","day":14}, 
"Marta": {"month":"Jan","day":16}}
def dates(birthdays, month):
   return ["{}: {}".format(a, b['day']) for a, b in birthdays.items() if b['month'] == month]

print(dates(birthdays, 'Jan'))

输出:

['Marta: 16', 'Anne: 27']

相关问题 更多 >