Python递归函数从dict中获取数据

时间:2019-02-27 06:51:02

标签: python recursion

我创建了一个递归函数来从字典中获取数据。 字典由键组成,每个键都有一个键列表,然后继续。因此,当我输入按键时,需要获取平整的按键列表。

我的词典:

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

在此先感谢您的帮助...

2 个答案:

答案 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']