pythonリストの理解;の圧縮、リストのリストがありますか?
-
21-08-2019 - |
質問
しまいました。んの最優雅な問題をどうなるだろうpythonは何かを組み合わせたものに思いです。
うになっているのが本作です。いリスト A
, い機能 f
する項目を返します。使用できますリストの理解に変換すべてのもの A
のようにしていただくことになります。
[f(a) for a in A]
このリストを返しますリスト;
[a1,a2,a3] => [[b11,b12],[b21,b22],[b31,b32]]
えていきたいと思っておりますの平坦化されたリスト
[b11,b12,b21,b22,b31,b32]
現在、その他の言語で;この伝統的と呼ばれ flatmap
機能プログラミング言語です。純と同じものを見ることができない SelectMany
.はpythonにおいても同じようなものは?あっき方を地図機能のリストをつぶしどのような特徴がありますか?
実際の問題のようにしているの解決にはこのはじめの一覧ディレクトリのすべてのサブディレクトリ.していただくことになります。
import os
dirs = ["c:\\usr", "c:\\temp"]
subs = [os.listdir(d) for d in dirs]
print subs
currentliy与えられることになるリストのリストがかしていけるのではないかと思い、リストを作成します。
解決
あなたは、単一のリスト内包で反復を入れ子にしていることができます:
[filename for path in dirs for filename in os.listdir(path)]
他のヒント
>>> listOfLists = [[1, 2],[3, 4, 5], [6]]
>>> reduce(list.__add__, listOfLists)
[1, 2, 3, 4, 5, 6]
私はitertoolsソリューションは、これよりもより効率的である推測しているが、これは非常にニシキヘビ感じ、ただ一つのリスト操作のためにライブラリをインポートする必要がなくなります。
質問はflatmap
を提案しました。いくつかの実装が提案されているが、彼らは、不要な中間リストを作成することがあります。ここではイテレータのベースだ一つの実施がある。
def flatmap(func, *iterable):
return itertools.chain.from_iterable(map(func, *iterable))
In [148]: list(flatmap(os.listdir, ['c:/mfg','c:/Intel']))
Out[148]: ['SPEC.pdf', 'W7ADD64EN006.cdr', 'W7ADD64EN006.pdf', 'ExtremeGraphics', 'Logs']
のPython 2.xでは、itertools.map
の代わりにmap
を使用します。
あなただけの簡単な操作を行うことができます:
subs = []
for d in dirs:
subs.extend(os.listdir(d))
できる連結リストを用いて、通常のほか、オペレーター:
>>> [1, 2] + [3, 4]
[1, 2, 3, 4]
内蔵機能 sum
追加のシーケンスできる任意の開始からあらかじめ定義された値:
>>> sum(xrange(10), 100)
145
との組み合わせによるカーブを平坦化の一覧リスト:
>>> sum([[1, 2], [3, 4]], [])
[1, 2, 3, 4]
すご flatmap
:
>>> def flatmap(f, seq):
... return sum([f(s) for s in seq], [])
...
>>> flatmap(range, [1,2,3])
[0, 0, 1, 0, 1, 2]
編集: 私は批評のコメント 他の答え とじゃないでしょうかそれを補正することPython不必要な構築やゴミの回収も小さく表示す事ができます。も制作に関するお問い合わせは約することは非常にシンプルかつ簡潔なんに使うプログラミング:-)
import itertools
x=[['b11','b12'],['b21','b22'],['b31']]
y=list(itertools.chain(*x))
print y
itertoolsはのpython2.3から動作し、大きい
subs = []
map(subs.extend, (os.listdir(d) for d in dirs))
(しかし、蟻の答えは優れている。彼のために+1)
あなたはこのように、itertools.chain()
を試すことができます:
import itertools
import os
dirs = ["c:\\usr", "c:\\temp"]
subs = list(itertools.chain(*[os.listdir(d) for d in dirs]))
print subs
itertools.chain()
はしたがってlist()
に渡し、イテレータを返します。
Googleは私に次の解決方法をもたらします:
def flatten(l):
if isinstance(l,list):
return sum(map(flatten,l))
else:
return l
あなたが使用することができます pyxtensionするます:
from pyxtension.streams import stream
stream([ [1,2,3], [4,5], [], [6] ]).flatMap() == range(7)
def flat_list(arr):
send_back = []
for i in arr:
if type(i) == list:
send_back += flat_list(i)
else:
send_back.append(i)
return send_back
If listA=[list1,list2,list3]
flattened_list=reduce(lambda x,y:x+y,listA)
これが行います。