2016-12-21 7 views
3

次のMWEを短縮するにはどうすればよいですか?複数のIF ... IN ... OR文を短縮する方法は?

files = ['a.txt', 'b.jpg', 'c.png', 'd.JPG', 'e.JPG'] 
images = [x for x in files if '.jpg' in x or '.png' in x or '.JPG' in x] 
print images 

私は

動作しません
files = ['a.txt', 'b.jpg', 'c.png', 'd.JPG', 'e.JPG'] 
images = [x for x in files if ('.jpg' or '.png' or '.JPG') in x] 
print images 

の観点で考えていました。

この投稿とは対照的に:Checking file extension、私はまた、ファイルの終わりに焦点を当てていない一般化に興味があります。

答えて

15

これは、あなたがin the docsを見ることができるようendswith()は、入力のためのタプルを取ることができますので、それが動作します

files = ['a.txt', 'b.jpg', 'c.png', 'd.JPG', 'e.JPG'] 
images = [x for x in files if x.endswith(('.jpg','.png','.JPG'))] 
print images 

少し短いです。

あなたも、このような何かがそれを行う必要があり、それ大文字小文字を区別しない

images = [x for x in files if x.lower().endswith(('.jpg','.png'))] 
+0

これは私のMWE、多くの感謝のために素晴らしい作品。拡張子として、endswith()は 'contains()' 'のようなものに置き換えられる可能性があるため、エンディングに焦点を当てていないケースに適用されるのが一般的でしょうか? – CFW

+1

@CFW pythonにはcontainsはありませんが、 'in'キーワードがあります。その場合、 '[x for y in x( '.jpg'、 '.png'、 '。JPG'))]'これは例えば ' 'abc.pngabc'' –

1

作るためにこれを行うことができます。

import os 

files = ['a.txt', 'b.jpg', 'c.png', 'd.JPG', 'e.JPG'] 
images = [x for x in files if os.path.splitext(x)[-1] in ['.jpg','.png','.JPG']] 
print images 
4

方法について:

files = ['a.txt', 'b.jpg', 'c.png', 'd.JPG', 'e.JPG'] 
formats = ('.jpg', '.png', '.JPG') 

# this gets you the images 
images = [file for file in files if any (format in file for format in formats)) 

# The above is equivalent to the following statement which is longer 
# and looks complicated but probably easy to understand for someone new to [python list comprehension][1] 
images = [file for file in files if any (format for format in formats if format in file)) 

しかし、しかし、有しますを確認する場合は、実際にthis answerを使用する必要があります10。私はただあなたの前提を広げました(あなたの質問に基づいて、inを使用しました)。リスト内包上

推奨読書は:python documentation

+0

なぜなら 'any(形式のファイル形式)'ではないのですか? –

+0

確かに、それは似たような@tobias_kです。 – zEro

+1

@zEro:編集した回答をそのまま残し、先に述べた回答を削除する方が良いでしょう。また、tobias_kという名前を答えから削除することもできます;彼は気にしません;) –

関連する問題