列表到嵌套列表和字典

2024-05-14 08:28:12 发布

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

我有一个很长的列表,想把它转换成嵌套列表和字典

L= ["a","abc","de","efg","", "b","ijk","lm","op","qr","", "c","123","45","6789"]          

输出:

nested list:
[["a","abc","de","efg"], ["b","ijk","lm","op","qr"], ["c","123","45","6789"]] 

dictionary: 
{"a":["abc","de","efg"],
"b":["ijk","lm","op","qr"], "c":["123","45","6789] } 

谁能告诉我如何在python中做到这一点? 我不能进口任何东西


Tags: 列表dictionary字典delistnestedqrlm
3条回答

下面是如何将L转换为嵌套列表:

L= ["a","abc","de","efg","","b","ijk","lm","op","qr","","c","123","45","6789"] 

nested_list_L = []

temp = []
for item in L:
    if item != "":
        temp.append(item)
    else:
        nested_list_L.append(temp)
        temp = []
        
nested_list_L.append(temp)

下面是如何将L转换为字典:

L= ["a","abc","de","efg","","b","ijk","lm","op","qr","","c","123","45","6789"] 

dict_L = {}

temp = []
key = ""
for item in L:
    if len(item) == 1:
        key = item
    elif len(item) > 1:
        temp.append(item)
    else:
        dict_L[key] = temp
        temp = []
        key = ""
        
dict_L[key] = temp

据我所知,您正试图:

  1. 按空字符串拆分列表,然后
  2. 将生成的嵌套列表转换为字典,使用每个子列表的第一个元素作为键,其余元素作为值

您当然可以在不导入任何内容的情况下完成任务。要拆分列表,只需在其上迭代并沿途构建嵌套列表:

def split(data, on):
    nested = []
    curr = []
    for x in data:
        if x == on:
            nested.append(curr)
            curr = []
        else:
            curr.append(x)
    if curr != [] or data[-1:] == [on]:
        nested.append(curr)
    return nested

然后,再次迭代此嵌套列表以构建所需的词典:

def build_dict(key_valss):
    d = {}
    for key_vals in key_valss:
        if key_vals != []:
            key = key_vals[0]
            vals = key_vals[1:]
            d[key] = vals
    return d

组合两个函数以获得所需内容:

>>> build_dict( split(data = ["a","abc","de","efg","", "b","ijk","lm","op","qr","", "c","123","45","6789"] , on = '') )
{'a': ['abc', 'de', 'efg'], 'b': ['ijk', 'lm', 'op', 'qr'], 'c': ['123', '45', '6789']}

我假设组由空字符串分隔。为此,您可以使用^{}

from itertools import groupby

data = ["a","abc","de","efg","", "b","ijk","lm","op","qr","", "c","123","45","6789"] 

nl = [list(g) for k, g in groupby(data, ''.__ne__) if k]
d = {next(g): list(g) for k, g in groupby(data, ''.__ne__) if k}

print(nl)
print(d)

结果:

[['a', 'abc', 'de', 'efg'], ['b', 'ijk', 'lm', 'op', 'qr'], ['c', '123', '45', '6789']]
{'a': ['abc', 'de', 'efg'], 'b': ['ijk', 'lm', 'op', 'qr'], 'c': ['123', '45', '6789']}

在groupby中,我使用了''.__ne__,它是空字符串的“notequal”函数。这样,它只捕获非空字符串组

编辑

我刚读到你不能导入。这里有一个使用循环的解决方案:

nl = [[]]

for s in data:
    if s:
        nl[-1].append(s)
    else:
        nl.append([])

至于这条格言:

itr = iter(data)
key = next(itr)
d = {key: []}

while True:
    try: val = next(itr)
    except StopIteration: break
    if val:
        d[key].append(val)
    else:
        key = next(itr)
        d[key] = []

相关问题 更多 >

    热门问题