2012-04-14 9 views
15

私は2つのforループを持っていますので、リストの理解やラムダなどのようにしたいと思っています。 どのように私は同じを達成することができますか?例えば2つのループの代わりにより良いコードを書いてください

filename = ['a.txt', 'b.txt', 'c.txt'] 
for files in filename: 
    for f in glob.glob(os.path.join(source_path, files)): 
     print f 
     ... some processing... 
+0

本当に必要があるかどうかを確認することをおすすめします。たとえば、Google Pythonのスタイルガイドでは、コードはそのままであることが示唆されています(ここでは[リストの解説]の一部です(http://google-styleguide.googlecode.com/svn/trunk/pyguide.html?showone=List_Comprehensions#List_Comprehensions )、ラムダ関数は以下の通りです)。 – Tony

答えて

27

あなたのコードをそのまま完全に罰金です。不要な複雑な構造を導入するだけで、読みにくくすることができます。

+0

@thebjom:不要な複雑な構造を説明できますか? – sam

+2

リスト内包もラムダも、そのコードの明確さを向上させることはないので、複雑さを増やすだけです。物事をより明確にすることができる状況はもちろんありますが、これはその時代の一つではありません。 – thebjorn

+3

+1。そして、Pythonic ==英語。時には、2、3、または4つのネストされたループを使って書くことはできません。なぜなら、理解やラムダを使うのは難しいからです。また、スタイルを盗んでしまうと、ドキュメントをデバッグして書き込むことができます。 – CppLearner

4

2つのforループを1つのgenerator expression *に圧縮し、新しいforループを使用してファイル名を抽出することができます。

for f in (f_ for files in filename 
      for f_ in glob.glob(os.path.join(source_path, files))): 
    print f 
    # ... 

他の答えが言ったように、これはない優れている、これは悪化し、あなたあるは、私はそれが十分重視だわからないんだけど(それを使用するべきではありません! )。何が起こっているのかを理解することははるかに難しく、おそらくパフォーマンス上のメリットはほとんどありません(実際には間接的な層があるため、遅い可能性があります)。

(*このような状況では、基本的にはリスト内包と同等の、より良い。)

2

ロング表現を使用すると、右の丸い背中にスキャンする必要がある場合に読みにくいです。多くの局所変数、ラムダ、内包語があり、数行で括弧とカンマで区切られているだけではさらに悪化します。あなたのコードが長く複雑にならない場合にのみ、それらを使用してください。
あなたの場合は、findをトレードオフとして抽出することをお勧めします。しかし、一番上の答えが言ったように、あなたのコードは十分です。

from itertools import chain 

find = lambda p: glob.glob(os.path.join(source_path, p)) 
for file in chain(map(find, filename)): 
    """ 
    =) I like one-level indentation here. 
    =(I don't know which file pattern is used currently, 
     unless I use longer expression... 
    """ 
4

私は以下のようにします。その理由は、検索パターンの構成、検索、およびファイルの評価を分離できるようになったからです。無関係であれば拡張が容易です。

システムが多少エキゾチック(分散ネットワークドライブなど)の場合、globとos.path.joinの両方の行は不愉快な行です。他の人が触れたように、2つのループは完全に大丈夫です。

filename = ['a.txt', 'b.txt', 'c.txt'] 

searchPatterns = [os.path.join(source_path, files) for files in filename] 

searchResults = [glob.glob(pattern) for pattern in searchPatterns] 

fileListFlat = sum(searchResults,[]) 

for file in fileListFlat: 
    print file 
関連する問題