首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理多级列表(2)

处理多级列表(2)
EN

Stack Overflow用户
提问于 2013-04-04 10:01:05
回答 3查看 782关注 0票数 2

假设我有一个列表,如:

代码语言:javascript
复制
li = ['0', ['1', '2'], ['3', ['4', '5'], '6', ['7'], '8'], '9']

如何实现以(elem, indexes)形式生成元组的函数?

  • elem
  • indexes是达到这个目的所需的索引。

示例:

代码语言:javascript
复制
>>> for x in my_func(li):
    print x
('0', [0])
('1', [1, 0])
('2', [1, 1])
('3', [2, 0])
('4', [2, 1, 0])
('5', [2, 1, 1])
('6', [2, 2])
('7', [2, 3, 0])
('8', [2, 4])
('9', [3])
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-04 10:02:34

这是一个嵌套版本

代码语言:javascript
复制
li = ['0', ['1', '2'], ['3', ['4', '5'], '6', ['7'], '8'], '9']
def to_int(lst, path=[]):
    for i, j in enumerate(lst):
        if isinstance(j, list):
            yield list(to_int(j, path+[i]))
        else:
            yield int(j), path+[i]

print(list(to_int(li)))

和扁平版(Python3.3+)

代码语言:javascript
复制
li = ['0', ['1', '2'], ['3', ['4', '5'], '6', ['7'], '8'], '9']
def to_int(lst, path=[]):
    for i, j in enumerate(lst):
        if isinstance(j, list):
            yield from to_int(j, path+[i])
        else:
            yield int(j), path+[i]

for item in to_int(li):
    print (item)

如果您不能使用yield from(< Python3.3),则必须以一种繁琐的方式编写它

代码语言:javascript
复制
li = ['0', ['1', '2'], ['3', ['4', '5'], '6', ['7'], '8'], '9']
def to_int(lst, path=[]):
    for i, j in enumerate(lst):
        if isinstance(j, list):
            for item in to_int(j, path+[i]): yield item
        else:
            yield int(j), path+[i]

for item in to_int(li):
    print (item)

注意,将空列表作为默认参数通常是个坏主意,但在这里,我们要小心不要改变它,所以没关系。

票数 5
EN

Stack Overflow用户

发布于 2013-04-04 10:05:48

代码语言:javascript
复制
def nextedindex(lst, indice=tuple()):
    for index, data in enumerate(lst):
        if isinstance(data, collections.Sequence):
            for next in nestedindex(data, indice + (index,)): yield next
        else:
            yield indice + (index,), data
票数 1
EN

Stack Overflow用户

发布于 2013-04-04 10:13:20

一个简单的递归版本。

这个循环递归地遍历列表的每个级别,跟踪索引路径以到达currentIndex中的当前循环。

代码语言:javascript
复制
def indexRecursive(alist, currentIndex, tuples):
    i = 0
    for item in alist:
        if type(item) != list:
           tuples.append((item, currentIndex + [i]))
        else:
            indexRecursive(alist[i], currentIndex + [i], tuples)
        i += 1

li = ['0', ['1', '2'], ['3', ['4', '5'], '6', ['7'], '8'], '9']
tuplesList = []
indexRecursive(li, [], tuplesList)
print tuplesList
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15808123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档