3

リストのリストがあります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-in私の質問は、Pythonでこれまたは任意の関数を実行するためのより良い方法があります。

PS:リストは1レベルだけネストされます。したがって、[ [a, [b,c] ], d, e ]可能性はありません。

4

2 に答える 2

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
于 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 に答える