2

重複の可能性:
Pythonのリストの(不規則な)リストをフラット化する

文字または文字のリストを要素とするPythonリストがあります。すべての要素を抽出する関数を次のように記述したいと思います。

仮定する

l=['a',['b',['c']] ]

The output need to be ['a','b','c']

これを行うには、再帰が正しい方法だと思いました。基本的なケースとして、リストに含まれる要素が1つだけである場合があります。これをコーディングしようとしましたが、出力は

['a', 'b', ['c']]

誰かがここで何が悪かったのか教えてもらえますか?

def get_all_elements(mylist):
    if len(mylist)==1:
        return mylist[0]
    else:
        output=[mylist[0]]
        output+=get_all_elements(mylist[1:])
        return output
4

3 に答える 3

3

これはうまくいくようです:

def flatten(iterable):
   out = []
   for i in iterable:
      if hasattr(i,'__iter__'):
         out.extend(flatten(i))
      else:
         out.append(i)
   return out

l=['a',['b',['c']] ]   
print flatten(l)

あなたが間違っていたのは、あなたのソリューションでmylist[0]は、それ自体が(任意の長さの)別のリストを含む(長さ1の)リストである可能性があるということです。その場合、あなたはそれを返しました。

于 2012-10-19T15:03:47.360 に答える
1

mylist長さが1であるかどうかを確認する場合、その内容がリストであるかどうかは確認しません。これがあなたの問題を浮き彫りにする例です。

get_all_elements([1, [2, [3, 4]]])

完全なソリューションが必要な場合は、Pythonで浅いリストをフラット化し、シーケンスのシーケンスをフラット化するための理解を行いますか?見るのに良い場所です。

于 2012-10-19T15:01:29.370 に答える
0

これは最大3レベルの深さで機能します。深さが任意の場合、リスト内包表記を使用できるとは思いません。

[grandchild for parent in l for child in parent for grandchild in child]
于 2012-10-19T15:03:02.913 に答える