質問

しまいました。んの最優雅な問題をどうなるだろう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))
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)

これが行います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top