15

2 つの for ループがあり、リスト内包表記やラムダなどのように改善したいと考えています。どうすれば同じことを達成できますか?

例えば ​​:

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...
4

4 に答える 4

27

あなたのコードはそのままで問題ありません。不必要な複雑な構造を導入することによってのみ、読みにくくすることができます。

于 2012-04-14T07:30:48.097 に答える
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
于 2012-04-15T01:26:06.977 に答える
4

for2 つのループを 1 つのジェネレータ式* に圧縮し、forそこからファイル名を抽出する新しいループを使用できます。

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

他の答えが言ったように、これは良くない、これは悪い、そしてあなたはそれを使うべきではありません(私はそれが十分な強調であるかどうか確信が持てません!)。何が起こっているのかを理解するのははるかに難しく、おそらくパフォーマンス上の利点はほとんどありません (実際、間接的なレイヤーが余分にあるということは、処理が遅くなる可能性が高いことを意味します)。

(* 基本的にリスト内包表記と同等ですが、このような状況ではより優れています。)

于 2012-04-14T07:42:34.730 に答える
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...
    """
于 2012-04-14T08:57:40.903 に答える