2017-01-26 3 views
2

У меня есть список (g.ordered), и я хочу добавить элемент в этот список в правильном порядке. g.ordered структурирована:Typeerror Float не подлежит подписке

# all values are floats 
g.ordered = [ 
    [[a, b, c, d...], [A]], 
    [[e, f, g, h...], [B]]... 
] 

# Where A is < B is < ... 

Я хочу добавить

x = [[q, w, e, r...], [C]] 
# Where C can be any float 

Я написал функцию, которая должна работать:

def insert(x): 
    for i in range(len(g.ordered)): 

     print(g.ordered[i][1]) 
     print(x[1]) 

     if(g.ordered[i][1] > x[1]): 
      break 
     g.ordered = g.ordered[:i] + x + g.ordered[i:] 

Теперь часть я не понимаю: когда я включают печатные заявления, которые он печатает, как я хочу:

>>> g.ordered[0][1] 
A 
>>> X[1] 
C 

Но после печати это дает мне ошибку;

print(g.ordered[i][1]) 
TypeError: 'float' object is not subscriptable 

Это после того, как оно уже завершило следующую строку.

Полная ошибка с отпечатками:

-4.882695743122578 # this is the A value 
0.01 # this is the C value 
# those where the expected prints which are in line 50 and 51 respecively 

Traceback (most recent call last): 
    File "/home/jjrreett/Genetic.py", line 57, in <module> 
    insert([[1,2,3,4,5], 0.01]) 
    File "/home/jjrreett/Genetic.py", line 50, in insert 
    print(g.ordered[i][1]) 

TypeError: 'Поплавок' объект не subscriptable

+2

По строке 49 печать g.ordered [i] если это поплавок, ответ вы ошибаетесь где-то – awiebe

ответ

0

Вы устанавливаете g.ordered к результату вычисления, когда вы на самом деле имел в виду g.ordered[i]:

def insert(x): 
    for i in range(len(g.ordered)): 
     ... 
     g.ordered[i] = g.ordered[:i] + x + g.ordered[i:] 
0

Вы неправильно перестроили список.

g.ordered = g.ordered[:i] + x + g.ordered[i:] 

должны быть:

g.ordered = g.ordered[:i] + [x] + g.ordered[i:] 

Кроме того, это утверждение должно быть вне цикла. Тем не менее, более надежное решение было бы добавить новый список до конца g.ordered, а затем повторно отсортировать список по ABC:

def insert(x): 
    g.ordered.append(x) 
    g.ordered = sorted(g.ordered, key=lambda x:x[1][0]) 
+0

Спасибо. Вы были на 100% прав. Проблема с переупорядочиванием списка каждый раз заключается в том, что это будет в цикле, поэтому я не хочу, чтобы время было проблемой. –

0
def insert(x): # you later try to subscript this float 
    for i in range(len(g.ordered)): 

     print(g.ordered[i][1]) 

     # On the following line, `x` is the float you passed in 
     # as a parameter. You can't subscript a float. 
     print(x[1]) 

     # Here again, you subscript the float `x` 
     # also, g.ordered[i][1] is a single element list `[A]` 
     # and not a value. g.ordered[i][1][0] would be `A` 
     if(g.ordered[i][1] > x[1]): 
      break 

     # This is not how you insert a value into a list. 
     # Should be g.ordered[:i] + [x] + g.ordered[i:] 
     # and not g.ordered[:i] + x + g.ordered[i:] 
     # Or, better yet, just use g.ordered.insert(i, x) 
     g.ordered = g.ordered[:i] + x + g.ordered[i:] 

даже после фиксации всего, что ваша функция все равно не будет делайте то, что вы намерены. Он вставляет единственное значение (параметр x) в g.ordered, а не структуру формы [[q, w, e, r, ...], [C]].

Кроме того, логика, которую вы используете, чтобы решить, куда вставлять, кажется, что она не сделает то, что вы ожидаете.

Решение DYZ выглядит так, что должно решить вашу проблему довольно элегантно.

Имейте в виду, однако, что с его решением вам необходимо передать в виде формы [[q, w, e, r, ...], [C]], а не просто поплавок. Основываясь на ошибке, о которой вы говорили, вы попадаете, кажется, что вы передаете одно значение float, а не структуру правильной формы. Поэтому вам все равно понадобится какой-то код, необходимый для правильной сборки.

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