2016-11-28 8 views
0

特定の条件に基づいて名前のリストをフィルタリングするためのコードを作成しました。これをさらに減らし、コードの冗長性を排除できるかどうかを見たいと思っていました。ここに私のコードは次のとおりです。Pythonでこのコードの行数を減らす方法はありますか?

names1 = ["Jane", "Jake", "Bradley", "Bill", "Betty", "Kara", "Kris", "Jil"] 
names2 = ["George", "Kate", "Karen", "Kurt", "Greg", "Gary"] 
selection_criteria = ["full_list", "four_characters", "three_characters", "start_with_k", "start_with_z"] 

def sublist (name_list, condition): 
    return_list = [] 
    if condition == "full_list": 
     return name_list 
    if condition == "four_characters": 
     for name in name_list: 
      if len(name) == 4: 
       return_list.append(name) 
    if condition == "three_characters": 
     for name in name_list: 
      if len(name) == 3: 
       return_list.append(name) 
    if condition == "start_with_k": 
     for name in name_list: 
      if name[0] == 'K': 
       return_list.append(name) 
    if condition == "start_with_z": 
     for name in name_list: 
      if name[0] == 'Z': 
       return_list.append(name) 
    return return_list 

for criteria in selection_criteria: 
    print(sublist(names1, criteria)) 

for criteria in selection_criteria: 
    print(sublist(names2, criteria)) 
+4

コードが機能している場合は、おそらくオフトピックです。代わりにhttps://codereview.stackexchange.com/にお送りください。 – Chris

+1

https://i.fluffy.cc/lv6bGSsq8bVkFRzTwd7ZH0bS6KxP7qnH.html(https://github.com/csvoss/onelinerizer経由) –

+0

@Chrisが言ったことをします。一見すると、私は二つの '条件'型 'starts_with_ *'と '* _characters'を見ます。これらのループのロジックをいくつかの 'start_letter'と' name_length'を受け入れる関数に抽出することができます。 – Carpetfizz

答えて

0

、あなた自身が実行する関数の名前として文字列を解釈見つけた場合、あなたはおそらく関数自体を渡すほうが良いと思います。 sublist()関数は、組み込みのfilter()関数(または、結果としてジェネレータではなくリストを得るために、Python 3ではおそらくlist(filter(...)))で置き換えることができます。可能な条件の一覧は次のようになります。

selection_criteria = [ 
    lambda n: True, # or simply None instead of a lambda 
    lambda n: len(n) == 4, 
    lambda n: len(n) == 3, 
    lambda n: n.startswith("K"), 
    lambda n: n.startswith("Z") 
] 
関連する問題