Python修改列表元素报错:'tuple' object does not support item assignment
解决 "tuple' object does not support item assignment" 错误
嘿,这个问题其实挺常见的,我来给你拆解清楚:
你代码里的核心问题出在元组的不可变性上。MySQL的cursor.fetchall()返回的结果是一个由元组(tuple)组成的列表——哪怕你用list(Tdata)把整个结果转成了列表,列表里的每一行数据依然是元组。而元组是Python里的不可变类型,你没法直接修改它内部的元素值,所以当你尝试data[i][4] = MPLCount时,Python就会抛出那个错误。
给你几个可行的解决方案:
方案1:把每行元组转成可变列表(最直观)
修改数据转换的那一行,把每个元组都转成列表,这样后续就能直接修改元素了:
Tdata = cursor.fetchall() #Get data from MYSQL database data = [list(row) for row in Tdata] # 将每个元组转为可变列表,替代原来的list(Tdata) APIData = APIDataList() MPLlat = 0.0 MPLLon = 0.0 RadiusOI = 15 for i in range(len(data)): MPLCount = 0 MPLlat = data[i][2] MPLLon = data[i][3] MPLCount = CountofbikesnearMPL(MPLlat, MPLLon, RadiusOI) if MPLCount > 0: data[i][4] = MPLCount # 现在可以正常修改,因为data[i]是列表而非元组
方案2:创建新元组替换原行(适合需要保留元组格式的场景)
如果之后你需要把数据存回数据库或者保持元组结构,可以通过创建新元组来替换原有的行(因为元组不可变,只能整体替换):
Tdata = cursor.fetchall() #Get data from MYSQL database data = list(Tdata) #Convert into list...not sure if absolutely required APIData = APIDataList() MPLlat = 0.0 MPLLon = 0.0 RadiusOI = 15 for i in range(len(data)): MPLCount = 0 MPLlat = data[i][2] MPLLon = data[i][3] MPLCount = CountofbikesnearMPL(MPLlat, MPLLon, RadiusOI) if MPLCount > 0: # 拆分原元组,替换第5个元素(索引4),生成新元组后替换原位置 new_row = data[i][:4] + (MPLCount,) + data[i][5:] data[i] = new_row
小优化:更简洁的遍历方式
另外,遍历列表时用enumerate可以同时拿到索引和元素,代码会更清晰:
for idx, row in enumerate(data): MPLlat = row[2] MPLLon = row[3] MPLCount = CountofbikesnearMPL(MPLlat, MPLLon, RadiusOI) if MPLCount > 0: data[idx][4] = MPLCount # 对应方案1的场景,row已经是列表的话也可以直接修改row[4]
内容的提问来源于stack exchange,提问作者Chelo
相关产品推荐
相关产品推荐

