我创建了一个递归函数来从字典中获取数据。 字典由键组成,每个键都有一个键列表,然后继续。因此,当我输入按键时,需要获取平整的按键列表。
我的词典:
data = {"p": ["s1", "s2", "s3", "s4"],
"s1": ["s1s1", "s1s2"],
"s2": [],
"s3": [],
"s4": [],
"s1s1": [],
"s1s2": ["s1s2s1"],
"s1s2s1": []
}
我的功能:
def get_data(key):
items = data[key]
if items:
for key in items:
items += get_data(key)
return items
当我致电get_data("p")
时返回
['s1', 's2', 's3', 's4', 's1s1', 's1s2', 's1s2s1', 's1s2s1']
但是预期的输出是:
['s1', 's2', 's3', 's4', 's1s1', 's1s2', 's1s2s1']
在此先感谢您的帮助...
答案 0 :(得分:3)
问题出在这些行中-
for key in items:
items += get_data(key)
在这里,您正在迭代时正在修改项目。因此,在上一次迭代中,您的items
最终多次获得相同的密钥;您可以添加一条日志记录语句,以查看正在使用哪个键来调用get_data
。
您要单独获取所有新项目,然后在迭代完成后更新项目-
new_items = []
for key in items:
new_items += get_data(key)
items += new_items
答案 1 :(得分:0)
下面的代码将帮助您实现所需的目标。获取唯一项目集合的常用方法是使用set。集是不同对象的无序集合。要从任何迭代创建集合,只需将其传递给内置的set()函数即可。如果以后再次需要真实列表,则可以类似地将集合传递给list()函数。
data = {"p": ["s1", "s2", "s3", "s4"],
"s1": ["s1s1", "s1s2"],
"s2": [],
"s3": [],
"s4": [],
"s1s1": [],
"s1s2": ["s1s2s1"],
"s1s2s1": []
}
def get_data(key):
items = data[key]
if items:
for keys in items:
items += get_data(keys)
return list(set(items))
print(get_data("p"))
输出:
['s3', 's1s1', 's1', 's1s2', 's2', 's1s2s1', 's4']
更新:保留订单的方法有两行:
from collections import OrderedDict
return OrderedDict((x, True) for x in items).keys()
将给定解决方案的return
行替换为Update:Solution的return
行,您将得到一个有序列表。
输出:
odict_keys(['s1', 's2', 's3', 's4', 's1s1', 's1s2', 's1s2s1'])
对已获得的输出使用list()
函数以获取以下列表:
['s1', 's2', 's3', 's4', 's1s1', 's1s2', 's1s2s1']