2017-02-15 8 views
-1

Я пытаюсь найти элементы в списках списка и использовать элементы для расчета. Но произошло TypeError: 'float' object is not subscriptable.python найти элементы в списках списка и объект «float» не подлежит индексированию

Вот вопрос/списки:

history_lists=[[1,2,3,4],[2,3,1],[5,8,0,1]] 

Я хочу, чтобы найти последние два элемента в каждом списке history_lists, и вычислить среднее значение.

Вот мои коды:

def get_question(self): 

    combined_lists_history.append(var1) 
    combined_lists_history.append(var2) 

    history_lists = [[] for _for _ in range(max(combined_lists_history[1::2]))] 

    for i in range(1, len(combined_lists_history),2): 
      history_lists[combined_lists_history[i]-1].append(combined_lists_history[i-1]) 

# this codes are for recreating a list of lists 
# combined_lists_history = [1,**1**,3,**1**,5,**3**,4,**1**,2,**2**,3,**2**,1,**2**,8,**3**,0,**3**,1,**3**,2,**1**,] 
# history_lists=[[1,2,3,4],[2,3,1],[5,8,0,1]] 

def get_avg(self): 

    for i, lst in enumerate(history_lists): 
      (history_lists[i][-1] + history_lists[i][-2])/2.0 
      # for each list in history_lists, retrieve last two item 
+1

Я неуверен об ошибке, но в любом случае я не думаю, что ваша программа будет делать то, что вы ожидаете. У вас есть цикл for с оператором return. Это означает, что программа будет только когда-либо идти в цикле и возвращаться. ваш весь блок кода эквивалентен 'return (history_lists [0] [- 1] + history_lists [0] [- 2])/2.0'. Может быть, вы хотите печатать вместо возврата? Или хранится где-то и распечатывать все это в конце цикла? – bouletta

+1

Почему 'return'? Если вы хотите создать генератор, используйте «yield». Кроме того, не называйте переменную 'list'. 'list (map (lambda x: sum (x [-2:])/2.0, history_lists))' должен доставить вас далеко. – Abdou

+0

ошибка не указана в коде, который вы указали. Полный стек и код, пожалуйста? –

ответ

-2

я думаю, что вы хотите сделать что-то больше вдоль этих линий ...

average = 0 
for list in history_lists: 
    final += (list[-1] + list[-2])/2 
print average 
+0

примечание: ответ должен быть на языке python, а не p ++ (я только что сделал это). Это слишком плохо, потому что я готов поощрять первые плакаты ... –

+0

Синтаксис ответа исправлен. Я писал много C# в последнее время, поэтому он немного смешался там, но должен быть прямо сейчас. – techkris

0

Используя свой стиль, а не более приближается Pythonic:

history_lists=[[1,2,3,4],[2,3,1],[5,8,0,1]] 
averages = [] 

# Don't use "list" as a variable name since that's a keyword 
for lst in history_lists: 
    avg = (lst[-1] + lst[-2])/2.0 
    averages.append(avg) 

print averages 

В качестве альтернативы, если вы хотите, чтобы все они усредняли:

history_lists=[[1,2,3,4],[2,3,1],[5,8,0,1]] 
total_count = 0 
total_sum = 0 

for lst in history_lists: 
    total_count += 2.0 
    total_sum += lst[-1] + lst[-2] 

total_average = total_sum/total_count 

print total_average 
1

Вы можете достичь этого сжато с пониманием списка:

history_lists=[[1,2,3,4],[2,3,1],[5,8,0,1]] 
averages=[(history_list[-1] + history_list[-2])/2.0 for history_list in history_lists] 

Ваша ошибка была, вероятно, потому, что все, что звонит ваша функция ожидает list быть возвращены, но так как вы используете return в цикле вместо этого он получает один поплавок. Это будет исправлено путем простого возврата списка averages, сгенерированного выше.

Edit: Добавлена ​​недостающие скобки

+0

Ах да, пропустили круглые скобки, спасибо за редактирование. – Ben