首页 > 解决方案 > TypeError:NoneType 不可订阅 - IF 语句

问题描述

我正在尝试查找大学名称的模糊字符串匹配项,并每次根据最接近的匹配项来自哪个列表,将某个分数 (10, 5 ,3) 打印到 csv 中。

data = [["MIT"], ["Stanford"], ...]

Data1 = ['MASSACHUSETTS INSTITUTE OF TECHNOLOGY (MIT)'], ['STANFORD UNIVERSITY'],...

到目前为止,我已经尝试过:

1 for uni in data:
2    hit = process.extractOne(str(uni[0]), data1, scorer = fuzz.token_set_ratio, score_cutoff = 90)
3    if float(hit[1]) < 100:
4       print("not found")
5    else:
        print("Closest match for " + str(uni[0]) + " is " + str(hit[0]) " + "score: 10")

在这一点上,我得到了TypeError: NoneType is unsubscriptable第 3 行

我检查了我的变量的类型:

print(type(hit)) #I was getting tuple now NoneType...
print(len(hit))  # Was getting 2 now unsubscriptable
print(float(hit[1])) # 100

据我了解,当变量不是人们认为的类型时,就会出现此错误。知道如何解决这个问题吗?非常感谢

感谢@inthevortex,我能够完成如下代码:

for uni in data:
hit = process.extractOne(str(uni[0]), data10, scorer = fuzz.token_set_ratio, score_cutoff = 90)
try:
    if float(hit[1]) >= 94:
        with open(filename, mode='a', newline="") as csv_file:
            fieldnames = ['bwbnr', 'uni_name', 'match', 'points']
            writer = csv.DictWriter(csv_file, fieldnames=fieldnames, delimiter=';')
            writer.writerow({'bwbnr': str(uni[0]), 'uni_name': str(uni[0]), 'match': str(hit), 'points': 10})

except:
    hit1 = process.extractOne(str(uni[0]), data11, scorer = fuzz.token_set_ratio, score_cutoff = 90)
    try:
        if float(hit1[1]) >= 94:
            with open(filename, mode='a', newline="") as csv_file:
                fieldnames = ['bwbnr', 'uni_name', 'match', 'points']
                writer = csv.DictWriter(csv_file, fieldnames=fieldnames, delimiter=';')
                writer.writerow({'bwbnr': str(uni[0]), 'uni_name': str(uni[0]), 'match': str(hit1), 'points': 5})

……以此类推……直到最后一个例外。

标签: python-3.xif-statementtypeerrorfuzzywuzzy

解决方案


感谢@inthevortex,我使用 try-except 方法完成了代码:

for uni in data:
hit = process.extractOne(str(uni[0]), data10, scorer = fuzz.token_set_ratio, score_cutoff = 90)
try:
   if float(hit[1]) >= 94:
       with open(filename, mode='a', newline="") as csv_file:
           fieldnames = ['bwbnr', 'uni_name', 'match', 'points']
           writer = csv.DictWriter(csv_file, fieldnames=fieldnames, delimiter=';')
           writer.writerow({'bwbnr': str(uni[0]), 'uni_name': str(uni[0]), 'match': str(hit), 'points': 10})

except:
hit1 = process.extractOne(str(uni[0]), data11, scorer = fuzz.token_set_ratio, score_cutoff = 90)
try:
    if float(hit1[1]) >= 94:
        with open(filename, mode='a', newline="") as csv_file:
            fieldnames = ['bwbnr', 'uni_name', 'match', 'points']
            writer = csv.DictWriter(csv_file, fieldnames=fieldnames, delimiter=';')
            writer.writerow({'bwbnr': str(uni[0]), 'uni_name': str(uni[0]), 'match': str(hit1), 'points': 5})

一直到我想比较的最后一个列表,再次尝试除外!


推荐阅读