【问题标题】:applying multiple if and elif statements to substrings in a list of strings in a for loop将多个 if 和 elif 语句应用于 for 循环中字符串列表中的子字符串
【发布时间】:2015-09-15 13:18:53
【问题描述】:

我有一个电子表格,在列 (C1:C3159) 中填充了杂乱无章的打开文本字段,我想按文本中的各种关键字对其进行排序。我正在尝试编写一些 python 代码来循环遍历该列,查找关键字,然后根据在文本中找到的单词将该单元格中的字符串类别附加到一个空列表中。到目前为止,我的代码如下所示。

## make an object attr for the column    
attr = ['C1:C3159']
## make all lower case
[x.lower() for x in attr]
## initialize an empty list
categories = []
## loop through attr object and append categories to the "categories" list
for i in attr:
    if 'pest' or 'weed' or 'disease' or 'cide' or 'incid' or 'trap'/
    or 'virus' or 'IPM' or 'blight' or 'incid' or 'rot' or 'suck' in i:
        categories.append("pest management")

    elif 'fert' or 'dap' or 'urea' or 'manga' or 'npk' pr 'inm' in i:
        categories.append("fertilizer")

    elif 'wind' or 'rain' or 'irr' or 'alt' or 'moist' or 'soil' or 'ph'\
    or 'drip'or 'environ' or 'ec' in i:
        categories.append("environment")

    elif 'spac' or 'name' or 'stor' or 'yield' or 'rogu' or 'maint'\
    or 'cond' or 'prod' or 'fenc' or 'child' or 'row' or 'prun' or 'hoe'\
    or 'weight' or 'prep' or 'plot' or 'pull' or 'topp' in i:
        categories.append("operations")

    elif 'plant' or 'germin' or 'age' or 'bulk' or 'buds'  or 'matur'\
    or 'harvest' or 'surviv' or 'health' or 'height' or 'grow' in i:
        categories.append("life cycle")

    elif 'price' or 'sold' or 'inr' or 'cost' in i:
        categories.append("market")

    elif 'shed' or 'post' or 'fenc' or 'pond' or 'stor' in i:
        categories.append("PPE")

    else:
        categories.append("uncategorized")

我遇到的问题是,在第一个 if 语句之后,elif 语句没有在循环中进行评估,并且我返回的列表仅包含归类为“害虫管理”的少数内容。有谁知道如何做我在这里尝试做的事情,以便评估整个循环?下面发布了列表中字符串的一小部分示例。

attr = ['Age of plantation',
'Altitude of Plantation',
'Annual production Last year (In Kg)',
'Average Price paid per kg in NPR (Last Year)',
'Majority Bush type',
'Pruning Cycle',
'Tea sold to ( Last Year)',
'Boll weight in grams',
'CLCuV incidence %',
'Dibbles per row',
'Gap Filling',
'Germination %',
'Hoeing',
'Land preparation',
'Land preparation date',
'Pest & disease incidence',
'Plot size in metre Square',
'Rows per entry',
'Spacing between plants in cms']

【问题讨论】:

  • 感谢您的编辑。在 stackoverflow 中为新手格式化是一个需要克服的不必要的棘手障碍。我现在有足够的代表发布相关数据的图片,这是一个加分项!

标签: python string if-statement for-loop substring


【解决方案1】:

修改

您必须使用 in 检查 if 情况下的所有字符串

if 'pest' in i or 'weed' in i or 'disease' in i or 'cide' in i or 'incid' in i or 'trap' in i  or 'virus' in i or 'IPM' in i or 'blight' in i or 'incid' in i or 'rot' in i or 'suck' in i:

每次在您的程序中,由于if 'pest' or,第一个if 语句为真

在 python 中

如果仅带有"" 的语句用于检查它是否为空字符串。如果是空字符串,则返回False,否则返回True。由于此属性,您的if 大小写匹配

if "sad":
    print "Why!"
output: Why!

if "":
    print "Why!"
output:         

【讨论】:

    【解决方案2】:

    我会为此使用正则表达式。

    很多人争辩说,如果你用正则表达式解决一个问题,你最终会遇到两个问题,但我相信如果你做的干净,你可以避免这种困境。

    import re
    
    pestmanagementattributes = [
        'pest', 'weed', 'disease', 'cide', 'incid', 'trap',
        'virus', 'IPM', 'blight', 'incid', 'rot', 'suck'
    ]
    r_pestmanagement = re.compile(".*" + (".*|.*".join(pestmanagementattributes)) + ".*")
    
    fertilizerattributes = ['fert', 'dap', 'urea', 'manga', 'npk', 'inm']
    r_fertilizer = re.compile(".*" + (".*|.*".join(fertilizerattributes)) + ".*")
    
    for i in attr:
        if r_pestmanagement.match(i):
            categories.append("pest management")
        elif r_fertilizer.match(i):
            categories.append("fertilizer")
    ...
        else:
            categories.append("uncategorized")
    

    这也应该更快执行,因为您的字符串 i 每个类别只扫描一次,而不是每个单词一次。

    【讨论】:

      【解决方案3】:

      if 语句不评估 elif 语句

      if-elif 语句是互斥的。如果您希望在第一个 if 之后评估其他 if 条件,请将每个语句放入 if 而不是 elif

      【讨论】:

        猜你喜欢
        • 2015-01-15
        • 2012-04-18
        • 2021-06-13
        • 1970-01-01
        • 2019-02-04
        • 2014-05-21
        • 2016-07-04
        • 1970-01-01
        • 2011-01-27
        相关资源
        最近更新 更多