Python:以指定格式打印列表列表

ron*_*nie 3 python list python-2.7

我有一份清单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
Run Code Online (Sandbox Code Playgroud)

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

另一个例子:

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

Output = 

1 aaa
2 bbb
3 xxx
4 ddd
Run Code Online (Sandbox Code Playgroud)

我的问题是有更好的方法来做这个或built-inpython中的任何功能.

PS:列表只有1级嵌套.所以,[ [a, [b,c] ], d, e ]不是一种可能性.

Gar*_*tty 7

你可以做到这一点很容易itertools.chain.from_iterable()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
Run Code Online (Sandbox Code Playgroud)

编辑:正如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
Run Code Online (Sandbox Code Playgroud)


mgi*_*son 6

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

def flatten(lst):
   for i in lst:
       if(isinstance(i,list)):
          for x in i:
              yield x
       else:
           yield x
Run Code Online (Sandbox Code Playgroud)

然后我会enumerate用于打印:

for idx,item in enumerate(flatten(lst),1):
    print idx,item
Run Code Online (Sandbox Code Playgroud)