Python - ' float'对象不可订阅

时间:2016-10-26 18:11:26

标签: python floating-point

运行以下代码时出现错误'float' object is not subscriptable:我认为错误发生,因为我使用列表位置输入surRates的值。

survRates = [[],[],[]]
newList = []
totalGens = 3

survRates[0] = 1.5
survRates[1] = 3.5
survRates[2] = 2.5

def gens():
    for i in range(totalGens):
        dataSet = []
        for j in range(3):
            dataSet.append([])
        newList.append(dataSet)
    print(newList)

def adultCalc(juvs):    
    newAdults = juvs * survRates[0][0]
    return newAdults

def senCalc(adults,sens):
    newSens = round((adults* survRates[1][0]) + (sens* survRates[2][0]),2)
    return newSens

generations()
newList[0][0] = 3.5
newList[0][1] = adultCalc(3)
newList[0][2] = senCalc(6,3)

print(newList)

当我通过将代码更改为survRates = [[1.5],[3.5],[2.5]]而不是初始化变量来运行相同的代码时,它可以正常工作。

survRates[0] = 1.5
survRates[1] = 3.5
survRates[2] = 2.5

我想要的结果是:[[1.5, 3.5, 2.1], [[], [], []], [[], [], []]]如果我使用survRates = [[1.5],[3.5],[2.5]]

2 个答案:

答案 0 :(得分:1)

是您想要的结果:

  

[[1.5, 3.5, 2.1], [[], [], []], [[], [], []]]

或者是吗?

  

[[[1.5], [3.5], [2.1]], [[], [], []], [[], [], []]]

因为第二个数据结构与您想要的数据结构相同。

然后你不需要这样做:

survRates[0] = 1.5
survRates[1] = 3.5
survRates[2] = 2.5

取而代之的是:

survRates[0] = []
survRates[0][0] = 1.5
survRates[0][1] = 3.5
survRates[0][2] = 2.5

或者因为你有非常具体的要求:看起来你的问题中有一个拼写错误:这可能是你真正想要的。

survRates = [[[], [], []], [[], [], []], [[], [], []]]
survRates[0][0][0] = 1.5
survRates[0][0][1] = 3.5
survRates[0][0][2] = 2.5

这样每个数组都只是一个只有一个元素的数组...因为我确定了邪恶的目的。

您没有准确描述您想要的内容:

你想在列表中设置位置0(第一个元素)而不是幸存者列表,而是在survRates's第一个元素的列表中设置列表(三重嵌套!)。因此,对于像幸存者这样的嵌套列表,为了访问您使用的第一个列表的第一个元素:an_array[0][0][0] =只需执行an_array[0] =an_array[0][0] =将尝试设置幸运率的第一个元素而不是幸存率&# 39;第一个列表或该列表的第一个列表。

此部分生成:[[[], [], []], [[], [], []], [[], [], []]]

def gens():
    for i in range(totalGens):
        dataSet = []
        for j in range(3):
            dataSet.append([])
        newList.append(dataSet)
    print(newList)

如果您需要进一步的帮助,请在此处解释更深入的内容。

  

newAdults = juvs * survRates [0] [0]

拥有一个硬编码的survRates[0][0]将返回一个列表,而不是一个元素可能不太可能你想用一个包含3个数学元素的列表乘以juv,你可能想要survRates[0][0][0]

更新==> 因为他们说他们特别希望它在第一个数据列表中有1个数组,在每个后续数据列表中有3个数组:

应该修改gens()函数:

def gens():
    for i in range(totalGens):
        dataSet = []
        for j in range(3):
            if i > 0:
                dataSet.append([])
        newList.append(dataSet)
    print(newList)

现在我们将有=>

[[], [[], [], []], [[], [], []]]

在帖子开头的这部分仍然会出错:

survRates[0] = 1.5
survRates[1] = 3.5
survRates[2] = 2.5

但是工作是:

 survRates[0][0] = 1.5
 survRates[0][1] = 3.5
 survRates[0][2] = 2.5

答案 1 :(得分:0)

您的问题似乎是如何初始化survRates

首先,创建一个长三个元素的列表,每个元素都是一个空列表。

    survRates = [[],[],[]]

这意味着:

  survRates[0] = []

接下来,列表的每个元素都从列表更改为float,而不是将float元素附加到列表中。

  survRates[0] = 1.5

创建survRates = [[1.5],[3.5],[2.5]]survRates[0] = 1.5更改为survRates[0].append(1.5)。这会将数字附加到空列表中。