2012-12-06 6 views
1

파이썬에서 더 효율적인 방법이 있는지 궁금합니다. I found a good solution in Ruby하지만 상당히 구체적인 것으로 보입니다.배열의 요소가 주어진 문자열의 부분 문자열인지 어떻게 알 수 있습니까?

기본적으로 API에서 기상 조건 데이터를 가져오고 있으며 7 가지로 뉘앙스 조건을 표준화하여 쉽게 처리 할 수 ​​있습니다.

def standardize_weather_conditions(s): 
    clear_chars = ['clear', 'sunny'] 
    clouds_chars = ['cloudy', 'overcast', 'fog'] 
    storm_chars = ['thunder'] 
    freezing_chars = ['ice', 'sleet', 'freezing rain', 'freezing drizzle'] 
    snow_chars = ['snow', 'blizzard'] 
    rain_chars = ['rain', 'drizzle', 'mist'] 

    if any_in_string(s, clear_chars): 
     conditions = 'clear' 
    elif any_in_string(s, clouds_chars): 
     conditions = 'clouds' 
    elif any_in_string(s, storm_chars): 
     conditions = 'storm' 
    elif any_in_string(s, freezing_chars): 
     conditions = 'freezing' 
    elif any_in_string(s, snow_chars): 
     conditions = 'snow' 
    elif any_in_string(s, wet_chars): 
     conditions = 'wet' 
    else: 
     conditions = 'other' 
    return conditions 

def any_in_string(s, array): 
    for e in array: 
     if e in s: 
      return True 
    return False 

답변

2

당신은 다음과 같이 정의 할 수 있습니다

def any_in_string(s, lst): 
    return any(word in s for word in lst) 
2

any_in_string 그런 다음 검색 단어의 당신의 목록에 대한 설명을 매핑 사전을 만들 수 return any([x in s for x in array])

을 수행하여 한 줄을 만들 수 있습니다 :

all_chars = {'clear':clear_chars, \ 
      'clouds':clouds_chars, \ 
      'storm':storm_chars, \ 
      'freezing':freezing_chars, \ 
      'snow':snow_chars, \ 
      'wet':rain_chars } 

for key in all_chars.keys(): 
    if any_in_string(s, all_chars[keys]): 
     return key 

return 'other' 

이렇게하면 '스파게티 코드' if-else 블록이 있습니다. 당신이 좀 더 멋진 얻고 싶었다 경우

, 당신은 위의 for 루프를 변경할 수 있습니다 :

conditions = [x for x in all_chars.keys() if any_in_string(s, all_chars[x])] 
conditions = ' and '.join(conditions) 
return conditions 

당신이 cloudy and wet 같은 것을 얻을 수있는이 방법을.

+0

두 번째 제안이 정말 마음에 듭니다. 어딘가에 맞을 수도 있습니다. 또한, 실제로 방금 비슷한 솔루션을 생각해 냈습니다. (그냥'any_in_string' 코드를 함수 호출 대신에 리터럴에 넣었습니다.) – delwin

관련 문제