3

我有一个 list 列表l = [['a','b', 'c'], 'd','e', ['f', 'g']]。列表元素并不总是必须是字母表。

现在,我使用了以下代码:

>>> index =1
>>> for i in l:
...     if isinstance(i, list):
...             for j in i :
...                     print index, j
...                     index = index + 1
...     else:
...             print index, i
...             index = index + 1
... 
1 a
2 b
3 c
4 d
5 e
6 f
7 g

您可以看到我打印出结果的格式。

另一个例子:

l = [['aaa','bbb','xxx'], 'ddd']

Output = 

1 aaa
2 bbb
3 xxx
4 ddd

我的问题是有没有更好的方法来做到这一点或built-inpython 中的任何功能。

PS:列表将只有 1 级嵌套。所以,[ [a, [b,c] ], d, e ]是不可能的。

4

2 回答 2

7

您可以使用itertools.chain.from_iterable()and轻松完成此操作enumerate()

>>> import itertools
>>> l = [['a','b', 'c'], 'd','e', ['f', 'g']]
>>> for index, value in enumerate(itertools.chain.from_iterable(l), 1):
...     print(index, value)
... 
1 a
2 b
3 c
4 d
5 e
6 f
7 g

编辑:正如 mgilson 指出的那样,这不适用于将多字符串作为顶层元素。我认为最好的解决方案是像他在回答中那样使用生成器,但是,我认为字符串是特例,而不是列表,所以我会颠倒逻辑:

def flatten(seq):
    for item in seq:
        if not isinstance(item, str): #Use `basestring` in 2.x
            yield from item
            #For Python <3.3
            #for subitem in item:
            #    yield subitem
        else:
            yield item
于 2012-10-15T12:31:07.573 回答
6

我会创建一个生成器来展平列表:

def flatten(lst):
   for i in lst:
       if(isinstance(i,list)):
          for x in i:
              yield x
       else:
           yield x

然后我将enumerate用于打印:

for idx,item in enumerate(flatten(lst),1):
    print idx,item
于 2012-10-15T12:32:18.767 回答