2016-10-26 4 views
1

Я получаю ошибку 'float' object is not subscriptable при запуске следующего кода: Я считаю, что ошибка возникает, так как я вводил значения surRates, используя их позиции в списке.Python - объект «float» не подлежит подписке

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]]

ответ

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, но вместо этого списка в списке survRates's первого элемента (трехкратно вложенная !). Таким образом, для вложенных списков, таких как survRates, для доступа к первому элементу первого списка, который вы используете: an_array[0][0][0] = только что делает an_array[0] = или an_array[0][0] =, попытается установить первый элемент списка оставшихся неперехваченных списков или первого списка этого списка.

Эта часть генерирует: [[[], [], []], [[], [], []], [[], [], []]]

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] возвращает список не элемент, вероятно, маловероятно, что вы хотите умножить juvs списком с 3-математических элементов, вероятно, вы хотите survRates[0][0][0] там.

UPDATE ==> Так как они говорят, что они особенно хотят его иметь 1 массив в первом списке данных и 3 массивы в каждом последующем DataList:

Генс() функция должна быть изменена:

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 
+0

Я хотел бы ввести значения 1.5.3.5 и 2.1 в выходы, как и "[[1.5, 3.5, 2.1], [[], [], []], [[], [], [] ]] '. [Здесь ссылка на мой предыдущий вопрос с выбранным ответом] (http://stackoverflow.com/questions/40250819/python-multiplying-an-element-from-2d-list). Я думаю, что оба эти вопроса связаны. – Test1234

+0

, но почему такая неравномерная структура данных? иногда вам нужен список из 3-х элементов, а иногда и список из 3-х списков внутри? вы уверены, что, возможно, словарь не является предпочтительным? например: 'survRates.adultRates = [1.5, 3.5, 2.1]' или что-то, а затем еще один ключ с 'survRates.unknownKey = [[], [], []]' похоже, что он будет путать вас реже. Чтобы помнить, как часто гнездо: в любом случае ваш код gens() делает сбалансированный список списков, потому что он сгенерирован в простом цикле ... если вы действительно хотите, чтобы первый элемент в списке был особым, исключите его из этого цикла. – Zargold

+0

Извините за путаницу. Я закончил тем, что использовал простой цикл, как мой код gens, и, похоже, он работал. Все равно, спасибо за помощь – Test1234

0

Ваш вопрос, как представляется, как инициализировать survRates.

Сначала вы создаете список, состоящий из трех элементов, каждый из которых является пустым.

Это означает:

survRates[0] = [] 

Далее, каждый элемент списка изменяется из списка к поплавку, вместо того, чтобы добавление элемента поплавка к списку.

survRates[0] = 1.5 

Для создания survRates = [[1.5],[3.5],[2.5]] изменения survRates[0] = 1.5 к survRates[0].append(1.5). Это добавляет число в пустой список.

Смежные вопросы