ホームページ  >  記事  >  バックエンド開発  >  ネストされたリストを平坦化する Python の簡単な実装

ネストされたリストを平坦化する Python の簡単な実装

WBOY
WBOYオリジナル
2016-06-16 08:47:591396ブラウズ

リストは Python で最も頻繁に使用されるデータ型であり、標準ライブラリには豊富な関数が用意されています。

しかし、多次元リストを 1 次元リストに変換する場合 (需要が多いかどうかはわかりませんが)、便利な関数を見つけるのは実際には簡単ではありません。

Ruby、Mathematica、Groovy の間には flatten があることを知っておく必要があります。

リストの次元が少なく、規則的であれば、比較的扱いやすいです

例:

li=[[1,2],[3,4],[5,6]]
print [j for i in li for j in i]
#or
from itertools import chain
print list(chain(*li))
#or
a=[[1,2],[3,4],[5,6]]
t=[]
[t.extend(i) for i in a]
print t
#or
print sum(li,[])

li=[1,[2],[[3]],[[4,[5],6]]] などのより複雑な場合、上記の方法は使いにくいため、はい、変更する必要があります。
構造はツリーのように見え、ディレクトリトラバーサルが考えやすいため、次のようなアプローチがあります:

def flat(tree):
  res = []
  for i in tree:
    if isinstance(i, list):
      res.extend(flat(i))
    else:
      res.append(i)
  return res

もう 1 つの考え方は、ネストされたリストは多数の角括弧のペアにすぎず、中央のリストを削除して文字列に変換するだけです。

def flatten(seq):
  s=str(seq).replace('[', '').replace(']', '') #当然也可以用正则
  return [eval(x) for x in s.split(',') if x.strip()]
ただし、このアプローチは、「[」または「]」を含む文字列がリストに表示される場合には効果がないため、改善する必要があります。

その他の方法:

海外のフォーラムで見たのですが、これも再帰的で一行でできます

flat=lambda L: sum(map(flat,L),[]) if isinstance(L,list) else [L]
次のメソッドは、メーリング リストで見られるメソッドである Tkinter モジュールを使用します。それができることを知らない学生も多いと思いますが、それは Python に付属しているものだと言えます。 Windows バージョンの Python には Tkinter モジュールが付属していますが、Linux にはデフォルトでそれが含まれていないことに注意してください

from Tkinter import _flatten

li=reduce(lambda *x:list(x),range(2,6),[1])
print li
print _flatten(li)
#Out:
#[[[[[1], 2], 3], 4], 5]
#(1, 2, 3, 4, 5)
#对元组同样适用
sympy、numpy、pipe など、そのような機能を提供するサードパーティ モジュールもいくつかあります。

ネストされたタプルについてはこれ以上説明する必要はありません。いくつかの変更を加えるだけです

上記の PYTHON によるネストされたリストの平坦化の簡単な実装は、エディターによって共有されたすべての内容です。参考にしていただければ幸いです。また、Script Home をサポートしていただければ幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。