假设我有一个类似于:
的嵌套列表[
[
['a', 'b', 'c'],
['d', 'e'],
['f', 'g', 'h', 'i']
],
[
['j'],
['k', 'l'],
['m', 'n', 'o']
],
[
['p'],
['q']
]
]
如何快速访问此列表中的第n个累积项?那么我可以要求第13项并获得对'm'
的引用?这需要非常快,因为我必须在我的程序中每秒多次执行此操作。
答案 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