Извлечение целых чисел из списка специальных символов - PullRequest
0 голосов
/ 27 июня 2018

У меня есть следующий список в Python

a = ['[', '1', ',', ' ', '0', ',', ' ', '0', ',', ' ', '0', ',', ' ', '0', ',', ' ', '1', ',', ' ', '0', ',', ' ', '1', ',', ' ', '1', ',', ' ', '0', ']'].

Я хочу извлечь целые числа из этого, чтобы я мог получить новый список [1,0,0,0,0,1,0,1,1,0]. Я использую Python 3.x и я попробовал решение, приведенное в ссылке Как извлечь числа из списка строк? , но, к сожалению, я получаю пустой список []. Кто-нибудь может мне помочь?

Ответы [ 4 ]

0 голосов
/ 27 июня 2018

Кто-то действительно испортил эти данные. У нас есть следующее:

a = ['[', '1', ',', ' ', '0', ',', ' ', '0', ',', ' ', '0', ',', ' ', '0', ',', ' ', '1', ',', ' ', '0', ',', ' ', '1', ',', ' ', '1', ',', ' ', '0', ']']

Давайте попробуем что-нибудь

b = ''.join(a)

Теперь b - это '[1, 0, 0, 0, 0, 1, 0, 1, 1, 0]'. Это похоже на задачу для literal_eval:

import ast
ast.literal_eval(b)

Et voilà, список вернулся: [1, 0, 0, 0, 0, 1, 0, 1, 1, 0].

Чтобы собрать все воедино:

import ast

a = ['[', '1', ',', ' ', '0', ',', ' ', '0', ',', ' ', '0', ',', ' ', '0', ',', ' ', '1', ',', ' ', '0', ',', ' ', '1', ',', ' ', '1', ',', ' ', '0', ']']
result = ast.literal_eval(''.join(a))

Кто бы ни создавал этот беспорядок данных, он использовал комбинацию приведений к строке и списку. Проверьте сами: print(str(list(str([1, 0, 0, 0, 0, 1, 0, 1, 1, 0]))))

0 голосов
/ 27 июня 2018

Если список пониманий типа

t = [int(x) for x in a if x.isdigit()]

и

t = [int(g) for g in filter(lambda x: x.isdigit(),a)] 

выше вас, вы можете использовать более простой подход. Переберите все элементы в вашем исходном списке, попробуйте преобразовать его в целое число, добавьте результат в список.

Если происходят ошибки, это не целое число, и вы игнорируете этот элемент и не добавляете его в список результатов:

a = ['[', '1', ',', ' ', '0', ',', ' ', '0', ',', ' ', '0', ',', ' ', '0', ',', ' ', '1', 
     ',', ' ', '0', ',', ' ', '1', ',', ' ', '1', ',', ' ', '0', ']']

rv = []

for text in a:
    try:
        rv.append(int(text))   # appennd if convertable to int,
    except: # catchall 
        pass                   # else pass

print(rv)

Выход:

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

ReadUp:

0 голосов
/ 27 июня 2018

Более эффективное решение:

list(map(int, filter(str.isdigit, a)))

Пожалуйста, прочитайте Понимание списка Python Vs. Карта . map быстрее, чем списки при работе с не лямбда-функциями.

0 голосов
/ 27 июня 2018

Использование isdigit с пониманием списка:

[int(i) for i in a if i.isdigit()]

# [1, 0, 0, 0, 0, 1, 0, 1, 1, 0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...