2016-05-02 8 views
1

私はPythonの3.5ラムダ表記法に取り掛かりつつあります。ネストしたループをラムダ1ライナーで置き換えることができますか? 例えば: 私はこの単純なダミーのクラス階層があります。Python 3.xでネストされたループのないネストしたリストの集合

class Resource: 
    def __init__(self, name="foo"): 
     self.name = name 

class Course: 
    def __init__(self): 
     self.resources = list() 

class College: 
    def __init__(self): 
     self.courses = list() 

私は私の出発点として、複数のCoursesResourcesCollegeのインスタンスを持っています。私は簡単に2 for-loopsでこれを行うことができ、私のCollege内のすべてのResourceslistをしたい場合は

college = College() 

は今:

all_resources = list() 
for course in college.courses: 
    for resource in course.resources: 
     all_resources.append(resource) 

これは確かに非常に単純ですが、私はまた、これを達成することができるかどうかを疑問に思いましたこのような何かやっによって:

all_resources = list(map(lambda r: r, [c.resources for c in college.courses])) 

をしかし残念ながら、これは私にのlistを与えますで、listResourcesではありません。ラムダはそれに適していますか? このような操作のための最も無作法な方法は何でしょうか?

答えて

6

まず、list()を呼び出すことにより、空のリストの作成を停止してください - それは文字通り空のリスト[]を(あなたは私を信じていない場合はtimeitでこれをcheeck)を使用するように簡単かつ迅速に両方です。

第2に、あなたが望むリストを作成するためにlambdaを使用する必要は絶対にありません。単純なリストの理解は仕事をするでしょう:

all_resources = [r for r in course.resources for course in college.courses] 

それを考え直してはいけません。できるだけシンプルにしてください。

2

これにはラムダを使用しないでください。あなたはリスト内包でなければなりません。

all_resources = [resource for resource for course in college.courses in course.resources] 

ラムダはここでは完全に不要です。あなたが絶対にしたいのなら、あなたは次のようなことをすることができます:

all_resources = [] 
[(lambda c: [all_resources.append(r) for r in c])(x) for x in college.courses)] 

私は最初のものをお勧めします。異なる注文を与える別の方法は、

all_resources = [resource for resource in course.resources for course in college.courses] 
関連する問題