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...
あなたのコードはそのままで問題ありません。不必要な複雑な構造を導入することによってのみ、読みにくくすることができます。
以下のようにします。その理由は、検索パターンの形成、検索、およびファイル処理を分離できるようになったためです。関係がない方が展開しやすい。
あなたのシステムが少し風変わりな場合 (分散ネットワーク ドライブなど)、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
for
2 つのループを 1 つのジェネレータ式* に圧縮し、for
そこからファイル名を抽出する新しいループを使用できます。
for f in (f_ for files in filename
for f_ in glob.glob(os.path.join(source_path, files))):
print f
# ...
他の答えが言ったように、これは良くない、これは悪い、そしてあなたはそれを使うべきではありません(私はそれが十分な強調であるかどうか確信が持てません!)。何が起こっているのかを理解するのははるかに難しく、おそらくパフォーマンス上の利点はほとんどありません (実際、間接的なレイヤーが余分にあるということは、処理が遅くなる可能性が高いことを意味します)。
(* 基本的にリスト内包表記と同等ですが、このような状況ではより優れています。)
右にスキャンして後ろに丸める必要がある場合、長い式は読みにくいです。多くのローカル変数、ラムダ、および内包表記があり、括弧とコンマで区切られているだけで、数行にある場合はさらに悪化します。コードが長く複雑にならない場合にのみ使用してください。
あなたの場合、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...
"""