【问题标题】:Mapping of values in python with loop instead of if statement使用循环而不是if语句在python中映射值
【发布时间】:2015-10-24 09:05:10
【问题描述】:

如何改进此功能?

最好将所有搜索行放在一个文件中左右。重要的是它们按此顺序排列。我可以使用while或吗?

def findlarm(text):
    """
    Lookijng for a lable to put on map
    :param text:
    :return:

    """
    if text.lower().find('brand i byggnad industri') >= 0:
        label = 'Brand i byggnad industri'
    elif text.lower().encode('utf8').find('trafikolycka påkörd person') >= 0:
        label = 'Trafikolycka påkörd person'
    elif text.lower().find('trafikolycka') >= 0:
        label = 'Trafikolycka'
    elif text.lower().find('brand i byggnad') >= 0:
        label = 'Brand i byggnad'
    elif text.lower().encode('utf8').find('röklukt') >= 0:
        label = 'Röklukt'
    elif text.lower().encode('utf8').find('Brand ute - terräng Gräsbrand') >= 0:
        label = 'Gräsbrand'
    elif text.lower().encode('utf8').find('Utsläpp farligt ämne') >= 0:
        label = 'Utsläpp farligt ämne'
    elif text.lower().encode('utf8').find('brand ute - övrigt') >= 0:
        label = 'Brand ute - övrigt'
    elif text.lower().encode('utf8').find('sjukvårdslarm') >= 0:
        label = 'Sjukvårdslarm'
    elif text.lower().encode('utf8').find('passning') >= 0:
        label = 'Passning station'
    elif text.lower().find('annat') >= 0:
        label = 'Annat larm'
    elif text.lower().find('skogsbrand') >= 0:
        label = 'Skogsbrand'
    elif text.lower().find('drunkning') >= 0:
        label = 'Drunkning'
    elif text.lower().find('fartyg') >= 0:
        label = 'Fartyg/Båtolycka'
    elif text.lower().find('ivpa') >= 0:
        label = 'IVPA'
    elif text.lower().find('automatiskt brandlarm') >= 0:
        label = 'Aut Brandlarm'
    elif text.lower().find('sjukdomsfall') >= 0:
        label = 'Sjukdomsfall'
    elif text.lower().find('brand') >= 0:
        label = 'Brand'
    elif text.lower().find('trauma') >= 0:
        label = 'Trauma'
    elif text.lower().encode('utf8').find('Järnväg - påkörd person') >= 0:
        label = 'Järnväg - påkörd person'
    elif text.lower().encode('utf8').find('övrigt ambulansassistans') >= 0:
        label = 'Ambulansassistans'
    else:
        label = 'Okänt larm'
    return label

【问题讨论】:

  • 您可以制作关键字和标签的字典,然后对其进行迭代,如果找到关键字,则将标签设置为 dict[keyword]。
  • 引用:“按此顺序排列很重要。”

标签: python if-statement text mapping tuples


【解决方案1】:

用要找到的字符串和相应的标签制作一个对(元组)列表。

然后循环遍历该列表直到找到匹配项,选择相应的标签并中断(或直接返回)。这是示例代码:

def findlarm(text):
    labels = [('foo', 'bar'), ('hans', 'wurst')]

    test = text.lower() #.encode('utf8')
    for l in labels:
        if test.find(l[0]) >= 0:
            return l[1]

    return 'Okänt larm'

我在使用 Python 3 时注释掉了 encode() 调用。

【讨论】:

  • 但是有了字典,你就失去了顺序! OP表示顺序很重要。
【解决方案2】:

您可以使用 for 循环,但我认为这是使用 for-in 循环以及字符串方法 capitalize() 的好地方:

mylist = [
    'brand i byggnad industri',
    'trafikolycka påkörd person',
    # etc.
]

label = None
for term in mylist:
    if text.lower().encode('utf8').find(term) >= 0:
        label = term.capitalize()
        break
return label  # returns None if none of the terms were found

编辑:正如另一位用户指出的那样,并非所有标签都是要查找的文本的大写版本。如果您需要不同的标签,那么另一个答案会更好。

【讨论】:

  • 最好用label = 'Okänt larm' 初始化label,因为它是else 值。并在 for 循环之前调用 text.lower().encode('utf8') 一次。无需一遍又一遍地重复该调用。
  • 哇,一天就有这么多答案。谢谢大家。我只是快速浏览了一下,我认为最后一个答案看起来最有希望。我可能会在今晚晚些时候尝试。
猜你喜欢
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多