Я пытаюсь нормализовать свои данные, и мне нужно перебрать набор для обучения и тестирования. Я пробовал по-разному, но я получаю эту ошибку list indices must be integers or slices, not list
. Я пробовал ставить range()
и len()
, но все равно получаю ту же ошибку.
Код:
def minMaxNrom(training_data, testing_data):
for i in training_data:
for j in training_data:
new_data = training_data[i][j] - min(j) / max(j) - min(j)
for i in testing_data:
for j in testing_data:
new_testing_data = testing_data[i][j] - min(j) / max(j) - min(j)
return (new_data, new_testing_data)
@dexter Это колледж, поэтому они не позволяют нам использовать библиотеки и хотят, чтобы мы сами кодировали их.
@TomKarzes Я пробовал, но тоже получил ошибку. Я также пробовал с len
, но все равно получаю ошибку, поэтому я запутался.
@Стефан, какой университет не разрешал бы студентам пользоваться библиотеками?
@dexter Я думаю, они хотят, чтобы мы узнали, как работают библиотеки/код.
Вы используете списки в качестве индексов. Вы можете использовать перечисление. Это исправит вашу ошибку:
def minMaxNrom(training_data, testing_data):
for indi, i in enumerate(training_data):
for indj, j in enumerate(training_data):
new_data = training_data[indi][indj] - min(j) / max(j) - min(j)
for indi, i in enumerate(testing_data):
for indj, j in enumerate(testing_data):
new_testing_data = testing_data[indi][indj] - min(j) / max(j) - min(j)
return (new_data, new_testing_data)
Без дополнительной информации трудно понять, почему ваш код дает сбой после устранения проблемы can't use list as index
, но вот мое предположение:
def minMaxNrom(training_data, testing_data):
new_data = []
new_testing_data = []
for indi, i in enumerate(training_data):
for indj, j in enumerate(training_data):
new_data.append((training_data[indi][indj] - min(j)) / (max(j) - min(j)))
for indi, i in enumerate(testing_data):
for indj, j in enumerate(testing_data):
new_testing_data.append((testing_data[indi][indj] - min(j)) / (max(j) - min(j)))
return (new_data, new_testing_data)
Скажем, у вас есть:
training_data = [[1, 2], [3, 4, 5], [4, 4, 4]]
for i in training_data:
print(i)
Это напечатает:
[1, 2]
[3, 4, 5]
[4, 4, 4]
Как видите, i
здесь каждый подсписок. Но чтобы получить доступ к этим подспискам со ссылкой, вы делаете:
print(training_data[0]) # gives first sublist
print('---')
print(training_data[1]) # gives second sublist
print('---')
print(training_data[2]) # gives third sublist
Это даст:
[1, 2]
---
[3, 4, 5]
---
[4, 4, 4]
Обратите внимание, что для доступа к этим подспискам мы используем число в качестве индекса, а не список (это то, что вы использовали). Итак, чтобы получить доступ к каждому списку и получить его индекс, мы используем перечисление (лучшее имя переменной для i
было бы sublist
):
for indi, i in enumerate(training_data):
print('indi: ', indi)
print('i: ', i)
print('training_data[indi]: ', training_data[indi])
print('---')
это дает:
indi: 0
i: [1, 2]
training_data[indi]: [1, 2]
---
indi: 1
i: [3, 4, 5]
training_data[indi]: [3, 4, 5]
---
indi: 2
i: [4, 4, 4]
training_data[indi]: [4, 4, 4]
Могу я спросить, почему вы используете indi, i
и indj, j
вместо одного?
Обновлен ответ на комментарий к ответу.
Спасибо за удивительное объяснение. Теперь я хочу спросить, почему мой индекс выходит за пределы допустимого диапазона?
Вы говорите о новой ошибке после использования целочисленных индексов? Один из способов, при котором функция может дать сбой, — это если training_data
(или testing_data
) пусто, т. е. testing_data = []
. Другой способ, которым функция может дать сбой, — это если ваши подсписки пусты, например, testing_data = [[1,2,3],[3,4], []]
(обратите внимание на третий пустой подсписок). Ваши функции max()
и min()
не будут работать в пустых списках, вы можете установить значения по умолчанию для max()
и min()
в случае пустого списка. Для какого входа функция не работает?
Обновлено дальше.
Похоже, мне нужно научиться правильно использовать ()
, спасибо.
Не только это, но и в обновленной версии вы добавляете к списку. С тем, что вы использовали изначально, вы выбрасывали все новые данные и просто сохраняли/возвращали последние. Первоначально я не исправлял это, поскольку вы упомянули, что это школьная работа, а это значит, что лучше глубоко погрузиться в отладку.
почему бы вам просто не использовать MinMaxScaler от
sklearn.preprocessing