我创建了一个递归函数来从字典中获取数据。词典由键组成,每个密钥都有一个键列表,并且还在继续。因此,当我给出密钥输入时,我需要获取键列表。
我的dict:
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']
事先感谢您的任何帮助...
问题在这些行中 -
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
这是一个代码,可以帮助您实现所需的目标。获取独特物品集合的常见方法是使用一组。集合是不同对象的无序集合。要从任何疑才能创建一个集合,您只需将其传递到内置set()函数即可。如果以后需要再次需要一个真实列表,则可以将集合传递到列表()函数。
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
行替换给定解决方案的return
行:解决方案,您将获得返回的有序列表。
输出:
odict_keys(['s1', 's2', 's3', 's4', 's1s1', 's1s2', 's1s2s1'])
将list()
功能与已达到的输出一起获取以下列表:
['s1', 's2', 's3', 's4', 's1s1', 's1s2', 's1s2s1']