Как отделить цифры от букв в тексте списка - PullRequest
1 голос
/ 03 февраля 2020

У меня есть list[], который содержит фразы типа list = ['123Abc','234Asx','456Aio','...']. Я хотел бы отделить цифры от букв. Рекуррентная модель - это 3 числа, за которыми следует заглавная буква A. Как я могу это сделать? Я пробовал много способов, используя list.replace, но я не знаю, как его установить, или нет, или нет лучшего метода для использования.

Ответы [ 5 ]

1 голос
/ 03 февраля 2020

Вы можете использовать понимание списка и добавить пробел в позиции 3 в каждой строке:

[e[:3] + ' ' + e[3:] for e in my_list]

вывод:

['123 Abc', '234 Asx', '456 Aio', '... ']
1 голос
/ 03 февраля 2020

Чтобы получить непрерывные группы предметов, используя функцию, чтобы определить, к какой группе принадлежит каждый предмет, используйте itertools.groupby. В вашем случае вам (предположительно) нужны непрерывные наборы цифр и не цифр, поэтому key равно isdigit(), примененное к каждому из символов в вашей входной строке.

Количество цифр может быть переменным, буквенная часть не обязательно должна начинаться с A, и вы на самом деле можете иметь любую последовательность цифр и букв в любом порядке: groupby разберет его.

Результатом groupby будет итератор (поэтому вы должны преобразовать его во что-то определенное, такое как список), в формате "key результат, групповой объект ". Вы можете увидеть, что isdigit правильно сработал для всех символов, распечатав немедленный результат:

from itertools import groupby

l = ['123Abc','234Asx','456Aio']
print ([(i,list(j)) for i,j in groupby (l[0], key=lambda x:x[0].isdigit())])

, то есть

[(True, ['1', '2', '3']), (False, ['A', 'b', 'c'])]

Преобразование list(j) обратно только в одну строку нужен join. Вы не хотите знать , есть ли у список цифр или нет, поэтому вы можете отбросить логический результат и сохранить только строки. Это

print ([''.join(j) for i,j in groupby (l[0], key=lambda x:x[0].isdigit())])

дает

['123', 'Abc']

для первого элемента в вашем списке, и если желаемый результат - список для каждого элемента в вашем текущем списке, добавьте итерацию вокруг этого :

print ([[''.join(j) for i,j in groupby (item, key=lambda x:x[0].isdigit())] for item in l])

возвращает

[['123', 'Abc'], ['234', 'Asx'], ['456', 'Aio']]
0 голосов
/ 03 февраля 2020

попробуйте это:

text = ['A'+i.split('A')[1] for i in list]
numbers = [i.split('A')[0] for i in list]

вывод:

['Abc', 'Asx', 'Aio']
['123', '234', '456']
0 голосов
/ 03 февраля 2020

Вот еще один способ сделать это, чтобы получить желаемый результат. Это делается с использованием re.findall и не зависит от сценария, в котором разделяющий символ равен «A».

import re

test_list = ['123Abc','234Asx','456Aio']

result = [' '.join(re.findall(r'[A-Za-z]+|\d+', x)) for x in test_list]

print(result)

Выход

['123 Abc', '234 Asx', '456 Aio']

Время, необходимое для run:

3.62 µs ± 13 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

Кажется, это работает быстрее, чем принятое решение. Исходя из моего анализа, принятое решение работает примерно:

5.79 µs ± 132 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

0 голосов
/ 03 февраля 2020
numbers = [int(val[:3]) for val in list]
text = [val[3:] for val in list]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...