python列表列表按累积索引访问元素

时间:2015-11-12 21:36:51

标签: python nested-lists

假设我有一个类似于:

的嵌套列表
[
    [
        ['a', 'b', 'c'],
        ['d', 'e'],
        ['f', 'g', 'h', 'i']
    ], 
    [
        ['j'], 
        ['k', 'l'], 
        ['m', 'n', 'o']
    ], 
    [
        ['p'], 
        ['q']
    ]
]

如何快速访问此列表中的第n个累积项?那么我可以要求第13项并获得对'm'的引用?这需要非常快,因为我必须在我的程序中每秒多次执行此操作。

2 个答案:

答案 0 :(得分:2)

基于你的评论“我真正需要的是能够通过累积索引找到常规索引,这样我就可以删除包含累积项目#10的第二级列表”,这应该做你想要的:不仅要压扁列表,还要跟踪你到达那里的路径:

def flatten(l, path=()):
    if not isinstance(l, list):
        yield path, l
        return

    for i, x in enumerate(l):
        for subpath, sub in flatten(x):
            yield (i,) + subpath, sub

这为您提供了一个生成器,因此您必须将其转换为列表:

>>> f = [ [ ... 
>>> res = list(flatten(f))
>>> print res[2]
((0, 0, 2), 'c')
>>> print res[10]
((1, 1, 0), 'k')
>>> print res[12]
((1, 2, 0), 'm')

或者,或许更好的是,创建一个函数来从生成器中获取nth项。如果您的列表很大并且这是在列表的开头,那么它甚至不需要生成其余的:

def nth(it, n):
    for i, val in enumerate(it):
        if i == n:
            return val

然后:

>>> print nth(flatten(f), 2)
((0, 0, 2), 'c')
>>> print nth(flatten(f), 10)
((1, 1, 0), 'k')
>>> print nth(flatten(f), 12)
((1, 2, 0), 'm')

因此:第二个元素是'c',位于f[0][0][2],第10个元素是'k',位于f[1][1][0],第12个元素是{{ 1}},位于'm'

答案 1 :(得分:0)

我会遍历清单。这实际上在python 3中只需要很少的代码:

@age

将您的数据存储在def flat(elem): if isinstance(elem, list): for e in elem: yield from flat(e) else: yield elem

lst