【问题标题】:Python - change value of list itemPython - 更改列表项的值
【发布时间】:2025-12-10 00:55:02
【问题描述】:

我的代码如下与 cmets。它运行良好,直到改变列表项的值,即 data[x][y] = something。

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(0,len(data))):
    MPLCount = 0
    MPLlat = data[i][2]
    MPLLon = data[i][3]
    MPLCount = CountofbikesnearMPL(MPLlat, MPLLon, RadiusOI)
    if MPLCount>0:
        data[i][4] = MPLCount #ERROR: here is where the error is kicking in. 
                              #get error "tuple' object does not support 
                              #item assignment"

我真的无法弄清楚为什么会发生这种情况,并尝试使用谷歌搜索但没有成功。任何帮助将不胜感激。

提前致谢。 C

【问题讨论】:

  • 您能帮我们打印出data[0] 并用结果编辑您的问题吗?
  • 感谢大家的快速响应.... print (data[0]) 给出 (1, 'Ealing', Decimal('51.495557600000000000000000000000'), Decimal('-0.255182700000000000000000000000'), 0)

标签: python arrays error-handling


【解决方案1】:

cursor.fetchall()returns a list of tuples.

这意味着data[i] 将是tuple,根据定义它是不可变的。如果你想修改data[i],你需要把你的元组变成列表

data = [list(row) for row in Tdata]

或通过元组连接替换整行

data[i] = data[i][:4] + (MPLCount,) + data[i][5:]

【讨论】:

  • 真的是要提交这个作为答案行。
  • 是的...data = [list(row) for row in Tdata] 很有魅力.. 喜欢这个社区。非常感谢你们
【解决方案2】:

也许用enumerate写会更简洁:

for i, elem in enumerate(data):
    # MPLCount = 0  - I suppose it is unnecessary since you overwrite the value below
    MPLlat = elem[2]
    MPLLon = elem[3]
    MPLCount = CountofbikesnearMPL(MPLlat, MPLLon, RadiusOI)
    if MPLCount > 0:
        data[i] = elem[:4] + (MPLCount,) + elem[5:]

您将变量和函数命名为ThisWay 有什么原因吗?如果没有,最好关注PEP8 并将它们命名为this_way。无论如何要保持一致,不要将两种风格混合在一起。

【讨论】:

  • 假设您的评论使用元组结构,您可以只写data[i] = elem[:4] + (MPLCount,),因为elem[4] 是您的元组中的最后一个
  • 为建议喝彩,非常感谢。 reg 为什么我这样写我的变量,嗯...我想我不精通两者的优缺点。我使用命名变量作为我很容易理解的东西滚动。但绝对是我应该研究的东西......并且会。再次感谢..
最近更新 更多