python-3.x - 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})
……以此类推……直到最后一个例外。
解决方案
感谢@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})
一直到我想比较的最后一个列表,再次尝试除外!
推荐阅读
- python - 如何从存储在多个嵌套字典中的数据创建 Pandas 框架?
- modelica - 通过 OMShell 和 OMPython 调用/运行模型时出错 - OpenModelica
- typescript - TypeScript:为什么没有参数的函数满足任何函数类型的要求?
- jpa - @DataSourceDefinition 中的错误网址
- javascript - 变量 'xxx' 在被赋值之前被使用
- excel - 与外部来源有关的问题
- python - 如何在这个程序中使用多线程和 tkinter
- node.js - 在哪里寻找“证书”和“密钥”来创建 https 服务器?
- google-chrome-devtools - Google chrome devtools 中的悬停选项不起作用
- c# - 使用 LINQ 查找最小值和最大值