Как изменить список строк на список элементов (чисел)?

#python #csv #txt

Вопрос:

Когда я использую:

 with open("test.txt") as file
    read = csv.reader(file)
    for i in read:
        print(i)
 

и у меня есть что-то вроде этого:

 ['[0', ' 0', ' 1', ' 0]']
 

и мне нужно:

 [0, 0, 1, 0]
 

Какие-нибудь советы, пожалуйста?

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

1. Используйте int() для приведения к целому числу. Используйте replace (), чтобы удалить» []»

2. Похоже, ваш файл не является файлом CSV. Можете ли вы поделиться образцом контента, который у него есть?

3. Это проблема XY . Это не CSV-файл. В файле были списки Python, записанные в него в виде строк. Исправьте файл, чтобы записать истинный CSV, или используйте ast.literal_eval для преобразования строки обратно в список Python.

4. Спасибо за помощь! Но я уже решаю свою проблему, принимая во внимание ответы ниже.

5. Тем не менее, они не были бы оптимальными ответами, если бы вы подробнее рассказали о своем контексте. Действительно ли файл является файлом CSV? Или это JSON? Или все-таки что-то другое?

Ответ №1:

 ad = ['[0', ' 0', ' 1', ' 0]']
for i in range(len(ad)):
    ad[i] = int(ad[i].replace("[", "").replace("]", ""))
print ad
[0, 0, 1, 0]
 

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

1. Спасибо за помощь! Но я уже решаю свою проблему, принимая во внимание все ответы. @Рагу Рам

Ответ №2:

Обычно самым простым решением было бы понимание списка, где new = [int(a) for a in old] . Однако в вашем случае первый и последний элементы вашего списка на самом деле тоже заключены в квадратные скобки.

Вместо этого вам нужно сделать что-то вроде:

 new = [int("".join(filter(str.isdigit, a))) for a in old]
 

Это довольно большой лайнер, так что давайте разберем его.

  1. Понимание списка повторяет каждый элемент в вашем списке (я назвал его old ) и называет его a
  2. A передается в filter команду с функцией str.isdigit . Это в основном удаляет любой символ, который не является цифрой. Проблема с этим заключается в том, что он возвращает итератор, а не простое значение.
  3. Чтобы устранить проблему с итератором, я обернул команду фильтра "".join() командой для преобразования ее в простое строковое значение. В этой строке будет только номер.
  4. Наконец, мы можем обернуть все это int командой, которая преобразует ваше значение в int.

Если вам не нравится однострочный, это также можно сделать таким образом:

 new = []
for a in old:
    filtered = filter(str.isdigit, a)
    num_str = "".join(filtered)
    num.append(int(num_str))
 

Это то же самое, но немного более подробно.

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

1. Спасибо за помощь! Но я уже решаю свою проблему, принимая во внимание все ответы. @Акилан Маниваннан

Ответ №3:

 def parseToInt(s): 
    ...:     return int((s.replace('[', '')).replace(']', ''))
 
 list(map(lambda x: parseToINt(x), a))
 

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

1. Спасибо за помощь! Но я уже решаю свою проблему, принимая во внимание все ответы. @Алекс