2016-11-28 79 views
0

我做了一个代码,根据特定的条件筛选名称列表..并希望看看我是否可以进一步减少此代码并消除冗余。这里是我的代码:有没有办法减少这段代码中的行数?

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

我把它压缩到ya的一行:https://i.fluffy.cc/lv6bGSsq8bVkFRzTwd7ZH0bS6KxP7qnH.html(通过https://github.com/csvoss/onelinerizer) –

+0

做什么@Chris说。乍一看,我看到两个'condition'类型,'starts_with_ *'和'* _characters'。您可以将这些循环的逻辑提取到分别接受'start_letter'和'name_length'的函数中。 – Carpetfizz

回答

0

在Python中,如果你发现自己解释字符串作为执行函数的名字,你可能会更好刚才路过的功能本身。您的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") 
] 
相关问题