2012-12-06 24 views
1

我想知道是否有更有效的方法来在Python中做到这一点。 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

相关问题