将多个 if 和 elif 语句应用于 for 循环中字符串列表中的子字符串

applying multiple if and elif statements to substrings in a list of strings in a for loop

我有一个电子表格,列 (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 语句,我返回的列表只包含归类为 "pest management." 的少数内容,有人知道吗如何做我在这里尝试做的事情,以便评估完整的循环?下面发布了列表中的一小部分字符串。

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']

修改

您必须使用 in 检查 if case

中的所有字符串
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

If 仅包含 "" 的语句用于检查它是否为空字符串。如果它是空字符串 False,则返回 else True。因此属性 您的 if 案例匹配

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

if "":
    print "Why!"
output:         

if 语句未评估 elif 语句

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

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

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

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 每个类别只扫描一次,而不是每个单词扫描一次。