#python #list #try-catch #valueerror
Вопрос:
Я пытаюсь преобразовать числовые строки в списке в формат с плавающей точкой, но у меня возникают трудности, вероятно, из-за того, что он находится в списке списков. Я не могу точно определить, как это исправить. Позже список будет преобразован в словарь
Мой формат списка выглядит следующим образом:
[['PokedexNumber','Name','Type','Total','HP','Attack','Defense','SpecialAttack','SpecialDefense','Speed'],
['001','Bulbasaur','GrassPoison','318','45',
'49','49','65','65','45'],
['002', 'Ivysaur', 'GrassPoison', '405', '60', '62', '63', '80', '80', '60']]
Мой код таков:
for i in newest_list:
try:
float(i)
except ValueError:
i
Ошибка, которую я получаю, такова:
Ошибка типа: аргумент float() должен быть строкой или числом, а не «списком»
Комментарии:
1. Почему ты хочешь это сделать? Я бы сказал, что, как правило, наличие списка в Python со смешанными типами не является идеальным. Почему бы просто не сохранить его в виде списка строк списка?
Ответ №1:
Используйте простое понимание списка и str.isnumeric
метод:
[[float(item) if item.isnumeric() else item for item in l] for l in newest_list]
выход:
[['PokedexNumber', 'Name', 'Type', 'Total', 'HP', 'Attack',
'Defense', 'SpecialAttack', 'SpecialDefense', 'Speed'],
[1.0, 'Bulbasaur', 'GrassPoison', 318.0, 45.0, 49.0, 49.0, 65.0, 65.0, 45.0],
[2.0, 'Ivysaur', 'GrassPoison', 405.0, 60.0, 62.0, 63.0, 80.0, 80.0, 60.0]]
Комментарии:
1. мило! обратите внимание, что вам не нужно понимание второго списка (см. Мой ответ ниже).
2. @rv.кветч, да, вы это сделаете, иначе он объединит подсписки в один 😉
3. о да, ты прав. ха-ха
Ответ №2:
Это потому, что у вас есть 2D массив размером 3Xn
Вам нужно добавить еще один цикл для повторения каждого внутреннего списка
for l in newest_list:
for string in inner_list:
try:
float(string)
except ValueError:
pass
Ответ №3:
Поскольку у вас есть список списков, попробуйте добавить еще for
один цикл для итерации по внутреннему списку:
L = [['PokedexNumber', 'Name', 'Type', 'Total', 'HP', 'Attack', 'Defense', 'SpecialAttack', 'SpecialDefense', 'Speed'],
['001', 'Bulbasaur', 'GrassPoison', '318', '45',
'49', '49', '65', '65', '45'],
['002', 'Ivysaur', 'GrassPoison', '405', '60', '62', '63', '80', '80', '60']]
for i in L:
## Added
for j in i:
## End
try:
float(j)
except ValueError:
j
Это становится еще проще с пониманием списка:
def try_parse_float(x):
try:
return float(x)
except ValueError:
return x
vals = [(try_parse_float(j)) for i in L for j in i]
или, вдохновленный ответом @mozway:
vals = [float(j) if j.isnumeric() else j for i in L for j in i]
Ответ №4:
Ваш список на самом деле представляет собой список списков, а не список, а не строку или цифру.
Цикл работы для будет выглядеть следующим образом
for l in newest_list:
for i in l:
try:
float(i)
except ValueError:
pass # using pass here as just using i doesn't do anything
Ответ №5:
С помощью второго цикла вы можете получить доступ к спискам в списке. Затем проверьте, можно ли преобразовать значения во внутреннем списке в значение с плавающей точкой. Если да, замените элемент списка строк типом float.
for idx,value in enumerate(newest_list):
for idx2, value2 in enumerate(value):
try:
float(value2)
newest_list[idx][idx2] = float(value2)
except ValueError:
pass
# To check the new types of the variables:
for idx,value in enumerate(newest_list):
for idx2, value2 in enumerate(value):
print(type(value2))