2016-11-28 2 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

나는 그것을 한 줄로 압축했다. https://i.fluffy.cc/lv6bGSsq8bVkFRzTwd7ZH0bS6KxP7qnH.html (https://github.com/csvoss/onelinerizer를 통해) –

+0

@Chris가 말한대로한다. 처음에는 두 개의 '조건'유형 인'starts_with_ *'와'* _characters'를 봅니다. 이러한 루프의 논리를 각각'start_letter'와'name_length'를 받아들이는 함수로 추출 할 수 있습니다. – Carpetfizz

답변

0

는, 당신은 아마 함수 자체를 전달하는 더 나을 것입니다. sublist() 함수는 내장 된 filter() 함수 (또는 파이썬 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") 
] 
관련 문제