Как изменить строковое значение, которое находится в списке, на плавающее в Python

#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))