【问题标题】:How can I get list levels of nested lists and add them as tuples?如何获取嵌套列表的列表级别并将它们添加为元组?
【发布时间】:2021-05-20 21:39:49
【问题描述】:

给定一个嵌套列表,比如

my_list = ['A', 'B', ['C', ['D', 'E'], 'F'], 'G']

有没有办法可以读取每个元素的列表级别,并返回它:

new_list = [('A', 0), ('B', 0), [('C', 1), [('D', 2), ('E', 2)], ('F', 1)], ('G', 0)]

非常感谢任何帮助或建议。

【问题讨论】:

  • Get nodes by level 包含您的大部分逻辑。见How much research?。多种形式的树遍历可通过直接浏览器搜索获得。我们希望您将这项研究纳入您的帖子中。
  • “告诉我如何解决这个编码问题”不是 Stack Overflow 问题。我们希望您做出诚实的尝试,然后然后就您的算法或技术提出一个具体的问题。 Stack Overflow 无意取代现有的文档和教程。

标签: python list nested


【解决方案1】:

你可以使用递归:

my_list = ['A', 'B', ['C', ['D', 'E'], 'F'], 'G']
def to_level(d, l = 0):
  return [(a, l) if not isinstance(a, list) else to_level(a, l+1) for a in d]

print(to_level(my_list))

输出:

[('A', 0), ('B', 0), [('C', 1), [('D', 2), ('E', 2)], ('F', 1)], ('G', 0)]

【讨论】:

  • 正是我想要的,谢谢!我一直在忙于类型比较和迭代
【解决方案2】:

如果列表中有两个相同的字母,这很讨厌并且不起作用,但是在这里,这个想法可能对某人有用:

import re

def foo(my_list):
    s = str(my_list)
    letters = re.findall("'.'", s)
    for letter, tup in zip(letters, [f'({res}, {min(s.count("[", 0, s.index(res))-1, s.count("]", s.index(res))-1)})' for res in letters]):
        s = s.replace(letter, tup)
    return eval(s)

它对列表进行字符串化,搜索字母,然后检查其左右括号的数量,这样它就可以确定其级别。然后相应地用括号替换字母,并使用eval 转换回列表。

【讨论】:

    【解决方案3】:

    您也可以使用生成器:

    from collections.abc import Sequence
    from typing import Any, Tuple
    
    
    def get_level(value: Any, level: int = 0) -> Tuple[Any, int]:
        for item in value:
            if isinstance(item, Sequence):
                yield from get_level(item, level + 1)
                continue
            yield item, level
    
    
    demo_list = ['A', 'B', ['C', ['D', 'E'], 'F'], 'G']
    print(list(get_level(demo_list)))
    
    demo_tuple = ('A', 'B')
    print(list(get_level(demo_tuple)))
    
    demo_single = 'A'
    print(list(get_level(demo_single)))
    

    输出:

    [('A', 0), ('B', 0), ('C', 1), ('D', 2), ('E', 2), ('F', 1), ('G', 0)]
    [('A', 0), ('B', 0)]
    [('A', 0)]
    

    【讨论】:

      猜你喜欢
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多