2016-08-31 8 views
2

リストを並べ替えることができますか?希望の順序でリストを並べ替える

ので、私は定義を含むファイルのリストを持っている私は、文字列をre.searchと一致するものを返す場合、私は文字列のみ+最高の定義

を印刷したいと思い、私は以下のアイデアを探求し始めたが、私-currentlyそれはあなたが唯一の単一の結果(最高)をしたい場合は、すべての3

#!/usr/bin/python3 
import re 
definitions = ['1080p', '720p', 'SD'] # order (highest to lowest) 
some_files = ['movie_a_1080p.mp4', 'movie_b_720p.mp4','movie_c_SD.mp4'] 

for each in some_files: 
    for defs in definitions: 
     match = re.search(defs, each, re.M | re.I) 
     if match: 
      if match.group() == '1080p': 
       print('1080p', each) 
       break 
      else: 
       if match.group() == '720p': 
        print('720p', each) 
        break 
       else: 
       if match.group() == 'SD': 
        print('SD', each) 
        break 

任意のヘルプは

+1

fyi: 'else:if:'を 'elif:'に置き換えてください。 –

+0

あなたはどんな出力を得たいですか? (私はあなたが何をしようとしているのか分かりません) – smarx

+1

好きな基準を使って項目のリストをソートするカスタムソート機能を定義することができます。 –

答えて

1

私はあなたが何をしようとして理解していれば、これは動作するはずです:

def best(some_files): 
    for definition in ('1080p', '720p', 'SD'): 
     match = next((file for file in some_files if definition in file), None) 
     if match is not None: 
      return match 

print(best(['movie_a_1080p.mp4', 'movie_b_720p.mp4', 'movie_c_SD.mp4'])) # movie_a_1080p.mp4 
print(best(['movie_b_720p.mp4', 'movie_c_SD.mp4', 'movie_a_1080p.mp4'])) # movie_a_1080p.mp4 
print(best(['movie_b_720p.mp4', 'movie_c_SD.mp4'])) # movie_b_720p.mp4 
print(best(['movie_d.mp4', 'movie_c_SD.mp4'])) # movie_c_SD.mp4 
print(best(['movie_d.mp4'])) # None 

あなたのアプローチの主な問題は、breakが唯一の勃発ということです最も近いループ。 @ alfasinの答えは、関数からの代わりにreturnでこれを修正します。ごdefinitionsが順番にあるので

for definition in ('1080p', '720p', 'SD'): 
    match = next((file for file in some_files if definition in file), None) 
    if match is not None: 
     print('Found the best one: {}'.format(match)) 
     break 
+0

これは完璧です。私が心に留めていたことを正確に表しています。本質的には、文中の深い部分から「復帰」することができますか?私の問題が適切に打ち砕かれなかったのかどうか疑問に思っていました。 – JONAS402

+1

まあ、囲み関数から 'return'が返されます。だから、そうするためには 'return'を使うことができますが、関数の中にいる場合に限ります。 – smarx

1

素晴らしいだろう印刷し、それが唯一の最高を印刷し得るように見えるし、あなたのリストが順序付けられていることを考慮することはできません最高から最低まで、あなたは単に戻ることができます最初の結果が発見された後:

import re 
definitions = ['1080p', '720p', 'SD'] # order (highest to lowest) 
some_files = ['movie_a_1080p.mp4', 'movie_b_720p.mp4', 'movie_c_SD.mp4'] 

def find(): 
    for each in some_files: 
     for defs in definitions: 
      match = re.search(defs, each, re.M | re.I) 
      if match: 
       return match.group(0) 


print(find()) 
2

、あなただけのリストをたどることができ、:あなたがしたい場合は、それが唯一の脱出するために一つのループを持っているので

私の答えはまた、単に、機能せずに使用することができ一致した場合にファイルを返します。

def best_quality(l): 
    definitions = ['1080p', '720p', 'SD'] # order (highest to lowest) 
    for definition in definitions: 
     for file in some_files: 
      if definition in file: return file 

some_files = ['movie_c_SD.mp4', 'movie_a_1080p.mp4', 'movie_b_720p.mp4'] 
print best_quality(some_files) 
>>> movie_a_1080p.mp4  
関連する問題