我有一个问题,我的新手知识无法解决 我试图将一些python-2.x代码(正在运行)复制到python-3.x.现在它给了我一个错误 这是代码的片段:
def littleUglyDataCollectionInTheSourceCode():
a = {
'Aabenraa': [842.86917819535, 25.58264089252],
'Aalborg': [706.92644963185, 27.22746146366],
'Aarhus': [696.60346488317, 25.67540525994],
'Albertslund': [632.49007681987, 27.70499807418],
'Allerød': [674.10474259426, 27.91964123274],
'Assens': [697.02257492453, 25.83386400960],
'Ballerup': [647.05121493736, 27.72466920284],
'Billund': [906.63431520239, 26.23136823557],
'Bornholm': [696.05765684503, 28.98396327957],
'Brøndby': [644.89390717471, 28.18974127413],
}
return a
和:
def calcComponent(data):
# Todo: implement inteface to set these values by
# the corresponding 'Kommune'
T = float(data.period)
k = 1.1
rH = 1.0
# import with s/\([^\s-].*?\)\t\([0-9.]*\)$/'\1':'\2',/
myDict = littleUglyDataCollectionInTheSourceCode();
#if data.kommune in myDict:
# https://docs.djangoproject.com/en/1.10/ref/unicode/
key = data.kommune.encode("utf-8")
rd = myDict.get(key.strip(), 0)
laP = float(rd[0]) # average precipitation
midV = float(rd[1]) # Middelværdi Klimagrid
print(("lap " + str(laP)))
print(("mid V" + str(midV)))
它给出错误:
line 14, in calcComponent
laP = float(rd[0]) # average precipitation
TypeError: 'int' object is not subscriptable
我尝试了不同的方法并阅读了几十个没有运气的aticles。作为一个新手,它就像在黑暗中翻滚。
答案 0 :(得分:1)
在您的示例中,myDict
是一个字典,其中字符串为键,列表为值。
key = data.kommune.encode("utf-8")
将是一个字节对象,因此字典中的该键不能有任何相应的值。这在python2中可以执行自动转换,但在python3中不再使用,你需要使用正确的类型进行查找。
rd = myDict.get(key.strip(), 0)
将始终返回整数0
,这意味着rd[0]
无法正常工作,因为整数不可索引,因为错误消息告诉您。
通常,get()
调用中的默认值应与所有其他情况下返回的内容兼容。将0
作为默认值返回,其中所有非默认情况返回列表只会导致问题。
答案 1 :(得分:1)
您使用0
作为rd
的默认值,而dict中的值是列表,因此如果找不到密钥,rd[0]
或rd[1]
将失败。相反,使用列表或元组作为默认值,然后它应该工作。
rd = myDict.get(key.strip(), [0, 0])
答案 2 :(得分:0)
这就是为什么谷歌搜索TypeError文本并没有引导我找到解决方案,因为我的问题是双重的。我忘记了Python3中的集成编码 我改变了:
key = data.kommune.encode("utf-8")
rd = myDict.get(key.strip(), 0)
为:
key = data.kommune
rd = myDict.get(key.strip(), [0, 0])
现在它起作用了: - )