【问题标题】:List to nested list and dictionary列表到嵌套列表和字典
【发布时间】:2020-08-03 01:47:58
【问题描述】:

我有一个很长的列表,想将其转换为嵌套列表和字典。

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 中做到这一点? 而且我不能导入任何东西

【问题讨论】:

  • 你试过什么代码?
  • 确定如何创建嵌套列表或字典的规则是什么?这是你需要解释的第一件事。然后正如@ReinstateMonica 所说,您需要提供一些代码来证明您至少已经进行了一次体面的尝试。第三,我怀疑进口甚至是必要的。
  • 列表中有 2 个空字符串。我想遍历列表并在 i == "" (空字符串)时拆分并将每个人都以嵌套形式或类似的形式。

标签: python list dictionary


【解决方案1】:

我假设这些组由空字符串分隔。为此,您可以使用itertools.groupby:

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__,它是空字符串“不等于”的函数。这样它只捕获非空字符串组。

编辑

我刚刚读到您无法导入。这是一个仅使用循环的解决方案:

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] = []

【讨论】:

  • everesteye 在问题中明确表示不能有任何进口。
  • @M-Chen-3 实际上我只是在编辑我的答案,因为我第一次没有阅读。
  • 可以理解。别担心。
  • 谁能告诉我如何在不导入任何内容的情况下从字符串中提取浮点数? isdigit() 不适用于浮点数
  • 有一个float方法:float(mystr)
【解决方案2】:

以下是将 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

【讨论】:

    【解决方案3】:

    据我了解,您正在尝试:

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

    【讨论】:

    • 感谢您的帮助。我现在一直在寻找浮动。你能告诉我如何在不使用导入的情况下从句子中提取浮点数吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    相关资源
    最近更新 更多