我有一个列表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
我的问题是有更好的方法在python中执行此操作或任何built-in
函数。
PS:列表只有1级嵌套。因此,[ [a, [b,c] ], d, e ]
不可能。
答案 0 :(得分: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
编辑:正如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
答案 1 :(得分: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