Преобразование чисел в строковом списке в int в Python

#python #python-3.x #list

Вопрос:

Как мне преобразовать этот список… список = [‘1’, ‘привет’, ‘боб’, ‘2’, ‘третий’, ‘3’, ‘0’]

К этому списку.. список = [1, «привет», «боб», 2, «третий», 3, «Н/Д»]

или

список = [1, 2, 3, ‘N/A’]

В основном я соскабливаю данные в список, и мне нужно число из этого списка, и мне нужно преобразовать все нули в N/A. Я попытался просмотреть список и заменить его, и я получаю ошибки другого типа.

 for i in list:
    if int(list[i]) == 0:
        call_list[i] = 'N/A'
 

Ошибка типа: индексы списка должны быть целыми числами или срезами, а не str

Если бы кто-нибудь мог помочь, это было бы потрясающе. Спасибо

Комментарии:

1. Вы имели в виду: if i == '0': ?

2. Не называйте список list !

3. Ха-ха — ха, Спасибо, Сэм, я думал об этом, но я хотел дать понять, что это был список.

Ответ №1:

Я подозреваю, что ваша главная проблема здесь в том, что вы не знаете, что str.isdigit() это существует, что проверяет, представляет ли строка число (т. Е. Вы можете преобразовать ее в число, не нажимая a ValueError .

Кроме того, если вы хотите выполнить итерацию по индексам в списке, вам нужно сделать for i in range(len(your_list)) это вместо for element in your_list . Python использует циклы для каждого, в отличие от языков, таких как C, и встроенная функция range() просто создаст список чисел от 0 до любого его аргумента (в данном случае len(your_list) ), который вы можете перебирать и использовать в качестве индексов.

 lst = ['1', 'hello', 'bob', '2', 'third', '3', '0']

for i in range(len(lst)):
    if lst[i].isdigit():
        lst[i] = int(lst[i])
        if lst[i] == 0:
            lst[i] = 'N/A'

print(lst)
 

Комментарии:

1. Спасибо вам за это, и вы на 100% правы, я не знал об isdigit(). Когда я это реализовал, это прекрасно сработало. Большое вам спасибо!!

Ответ №2:

Простой подход состоит в том, чтобы определить функцию, которая говорит, что вы хотите сделать с каждым элементом:

 def convert(item):
    try:
        return int(item) or 'N/A'
    except ValueError:
        return None  # or the original item?
 

а затем используйте эту функцию для создания своего нового списка:

 >>> data = ['1', 'hello', 'bob', '2', 'third', '3', '0']
>>> [convert(d) for d in data if convert(d) is not None]
[1, 2, 3, 'N/A']
 

Обратите внимание , что если вы измените последнюю строку функции на return item , вы можете сохранить исходные версии элементов, которые не преобразуются в int:

 >>> def convert(item):
...     try:
...         return int(item) or 'N/A'
...     except ValueError:
...         return item
...
>>> [convert(d) for d in data]
[1, 'hello', 'bob', 2, 'third', 3, 'N/A']
 

Комментарии:

1. Спасибо вам за это!! Я еще не реализовал его, но собираюсь попробовать. Это также выглядит как блестящее решение, потому что я могу просто запускать списки через функцию. это было бы очень эффективно.

Ответ №3:

Вам нужна пользовательская функция преобразования, которая может соответствовать вашим конкретным требованиям, а затем использовать ее для понимания списка.

 mylist = ['1', 'hello', 'bob', '2', 'third', '3', '0']

def convert(text: str):
  try:
      i = int(text)
  except (TypeError, ValueError):
      return text
  return "N/A" if i==0 else i

new_list = [convert(x) for x in mylist]
new_list2 = [x for x in new_list if isinstance(x, int) or x=='N/A']
 

Ответ №4:

используя понимание списка, которое проверяет, является ли элемент цифрой, но не нулем, если это так, оно преобразует его в int, в противном случае оно проверяет, равен ли он нулю, и преобразует его в «N/A», и, наконец, сохраняет все остальное нетронутым

 l =['1', 'hello', 'bob', '2', 'third', '3', '0']
print ([int(item) if item.isdigit() and item != '0' else 'N/A' if item == '0' else item for item in l])
 

выходы:
[1, 'hello', 'bob', 2, 'third', 3, 'N/A']

или то же самое в немного более читаемой форме

 print ([
        int(item) if item.isdigit() and item != '0' 
        else 'N/A' if item == '0' 
        else item 
        for item in l
])
 

Комментарии:

1. близко, но не справляется 'N/A' !

2. исправлена обработка N/A