python递归函数从dict获取数据



我创建了一个递归函数来从字典中获取数据。词典由键组成,每个密钥都有一个键列表,并且还在继续。因此,当我给出密钥输入时,我需要获取键列表。

我的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']

最新更新