从层次代码列表中提取递归字典

2024-04-26 06:36:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个(大约100个)值的列表,如下所示:

list = ['40201020', '45102020', '25203020', '20106020', '25301020', '40402030', '20202010']

我需要一本字典

a)列出每个值的所有父级。父项少一位(从右起):

child = '40201020'
parent = '4020102'

这种格式比较理想:

dict['4020102parent'] = '40201020'

b)我需要父母的所有父母,最多剩下一位。所以父'4020102'得到这个父:

dict['4020102parent"] = '402010'

以及

dict['402010parent"] = '40201'

等等

c)然后我需要每个父代的所有最后的子代作为一个列表。我说的最后一个后代是指原始列表的8位代码。所以数字“4”会有以下代码:

dict['4children'] = ['40201020', '45102020', '40402030']

或:

dict['40children'] = ['40201020', '40402030']

Tags: 代码child列表字典格式数字dictlist
3条回答

您的列表是否总是包含字符串?是否需要词典?如果您总是使用字符串,并且只想找到一种查找父对象和子对象的方法,那么我建议您使用python的字符串处理功能。您可以这样定义函数parentchildren

def parent(list_item):
    return list_item[:-1]

def children(my_list, parent_str):
    children_found = []
    for item in my_list:
        if item.startswith(parent_str)
            children_found.append(item)
    return children_found

然后调用parent('40201020')将产生'4020102',调用children(my_list, '40')将产生['40201020', '40402030']。您可以递归地调用parent,以获得一个字符串,每次少一个项。你知道吗

我仍然很困惑,当您可以将递归结果存储在一个列表中并且可以使用str.startswith开始()方法:

我仍然将parentdict存储在dict\ u数据中,您可以使用它:

list1 = ['40201020', '45102020', '25203020', '20106020', '25301020', '40402030', '20202010']

dict_data=[]
track=[]
list_2={}

def main_function(lst_1):
    for i in lst_1:
        def recursive(lst):
            parent = {}
            if not lst:
                return 0
            else:
                parent[lst[:-1] + 'parent'] = lst
                track.append(lst)
                dict_data.append(parent)


            return recursive(lst[:-1])

        recursive(i)
main_function(list1)

for recursive_unit in set(track):
    for items in list1:
        if items.startswith(recursive_unit):
            if recursive_unit not in list_2:
                list_2[recursive_unit]=[items]
            else:
                list_2[recursive_unit].append(items)

print(list_2)

输出:

{'25203': ['25203020'], '25': ['25203020', '25301020'],'4': ['40201020', '45102020', '40402030'],'4510': ['45102020'], '2520302': ['25203020'], '40402030': ['40402030'], '2010602': ['20106020'], '45102020': ['45102020'], '45': ['45102020'], '253010': ['25301020'], '4020': ['40201020'], '252': ['25203020'], '20202010': ['20202010'], '20106': ['20106020'], '201060': ['20106020'],'202020': ['20202010'], '2530102': ['25301020'], '402': ['40201020'], '2010': ['20106020'], '4510202': ['45102020'], '2530': ['25301020'], '451020': ['45102020'], '2020201': ['20202010'], '404020': ['40402030'], '25203020': ['25203020'], '2': ['25203020', '20106020', '25301020', '20202010'], '20202': ['20202010'], '253': ['25301020'], '40402': ['40402030'], '451': ['45102020'], '40201020': ['40201020'], '252030': ['25203020'], '2520': ['25203020'], '40': ['40201020', '40402030'], '4040': ['40402030'], '402010': ['40201020'], '4020102': ['40201020'], '25301020': ['25301020'], '20106020': ['20106020'], '201': ['20106020'], '20': ['20106020', '20202010'], '202': ['20202010'], '40201': ['40201020'], '45102': ['45102020'], '2020': ['20202010'], '25301': ['25301020'], '4040203': ['40402030'], '404': ['40402030']}

正如我在评论中所说的那样,一本每一个键都包含孩子的字典似乎是一个更合理的想法。你知道吗

为了实现这一点,我们可以循环遍历列表中的每个元素(我将其重命名为l,以避免重写内置的list()函数),并将该值附加到字典中其所有父元素的列表d。你知道吗

上述方法的代码将沿着以下几行:

d = {}
for i in l:
    for e in range(1, len(l)-1):
        d.setdefault(i[:e], []).append(i)

这将允许您执行以下操作:

>>> d['4']
['40201020', '45102020', '40402030']
>>> d['40']
['40201020', '40402030']
>>> d['25']
['25203020', '25301020']

相关问题 更多 >