Python 使用递归查找嵌套dict的值并返回dict的键
我有一个练习,其中生日字典如下:Python 使用递归查找嵌套dict的值并返回dict的键,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我有一个练习,其中生日字典如下: birthdays = {"Anne": {"month":"Jan","day":"27"}, "Mike":{"month":"Feb","day":"13"}, "Nicolas":{"month":"Jun","day":14}, "Marta": {"month":"Jan","day":16}} 问题是定义一个函数,给定一个月,该函数将打印出该月所有生日的人的列表,以及日期 以下是到目前为止我得到的信息:
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)
当称为birthbymonth(生日,“Jan”)时,打印:
但是我不知道如何打印那些有生日的人的名字。我看不出有任何理由在这里使用递归
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']
如果您真的想使用递归(不推荐用于此问题),可以对现有代码进行一些修改:
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)]
这里有一个解决方案:
birthdays = {"Anne": {"month":"Jan","day":"27"},
"Mike": {"month":"Feb","day":"13"},
"Nicolas": {"month":"Jun","day":14},
"Marta": {"month":"Jan","day":16}}
{k: v['day'] for k, v in birthdays.items() if v['month']=='Jan'}
# {'Anne': '27', 'Marta': 16}
birthdays = {"Anne": {"month":"Jan","day":"27"},
"Mike": {"month":"Feb","day":"13"},
"Nicolas": {"month":"Jun","day":14},
"Marta": {"month":"Jan","day":16}}
{k: v['day'] for k, v in birthdays.items() if v['month']=='Jan'}
# {'Anne': '27', 'Marta': 16}