У меня есть длинный список, как это: A = ['ABCd 123', 'Efhgh 345', 'dhAsadjkhdk 23']
Возьмите только буквы из строки элементов
Как я могу получить только буквы части без номеров и сделать их еще один список?
У меня есть длинный список, как это: A = ['ABCd 123', 'Efhgh 345', 'dhAsadjkhdk 23']
Возьмите только буквы из строки элементов
Как я могу получить только буквы части без номеров и сделать их еще один список?
>>> A = ['ABCd 123', 'Efhgh 345', 'dhAsadjkhdk 23']
>>> B = list(map(lambda x: ''.join([letter for letter in x if letter.isalpha()]), A))
>>> B
['ABCd', 'Efhgh', 'dhAsadjkhdk']
filter()
был бы лучшим выбором, чем map()
:
>>> A = ['ABCd 123', 'Efhgh 345', 'dhAsadjkhdk 23']
>>> B = [''.join(filter(str.isalpha, a)) for a in A]
>>> B
['ABCd', 'Efhgh', 'dhAsadjkhdk']
Это, конечно, в основном идентичны @ chrisaycock отвечают.
Если вы хотите исключить повторяющиеся записи, используйте set
:
>>> A = ['ABCd 123', 'Efhgh 345', 'dhAsadjkhdk 23', 'ABCd 95']
>>> B = set(''.join(filter(str.isalpha, a)) for a in A)
>>> B
{'Efhgh', 'dhAsadjkhdk', 'ABCd'}
Если вы хотите исключить повторяющиеся записи, но вам необходимо сохранять порядок первоначального списка, сортировать набор по индекс:
>>> A = ['ABCd 123', 'Efhgh 345', 'dhAsadjkhdk 23', 'ABCd 95']
>>> B = [''.join(filter(str.isalpha, a)) for a in A]
>>> B
['ABCd', 'Efhgh', 'dhAsadjkhdk', 'ABCd']
>>> C = sorted(set(B), key=lambda x: B.index(x))
>>> C
['ABCd', 'Efhgh', 'dhAsadjkhdk']
или избежать промежуточного list
и set
, делая это вручную:
>>> A = ['ABCd 123', 'Efhgh 345', 'dhAsadjkhdk 23', 'ABCd 95']
>>> B = []
>>> for a in A:
... b = ''.join(filter(str.isalpha, a))
... if b not in B:
... B.append(b)
...
>>> B
['ABCd', 'Efhgh', 'dhAsadjkhdk']
>>> values = ['ABCd 123', 'Efhgh 345', 'dhAsadjkhdk 23']
>>> [value.split()[0] for value in values]
['ABCd', 'Efhgh', 'dhAsadjkhdk']
Это предполагает определенную структуру, которая не была упомянута или подтверждена и может быть случайной. – TigerhawkT3
@ TigerhawkT3 нужно больше тестовых случаев. –
Используйте регулярные выражения для поиска групп букв в списке:
words = map(lambda s: re.findall(r'[a-zA-Z]+', s), A)
words = list(itertools.chain.from_iterable(words))
Использование re.sub
, это довольно просто!
>>> strings = ['ABCd 123', 'Efhgh 345', 'dhAsadjkhdk 23']
>>> import re
>>> [re.sub(r'[^A-Za-z]+', '', s) for s in strings]
['ABCd', 'Efhgh', 'dhAsadjkhdk']
Хотите номера тоже?
>>> [re.sub(r'[^\d]+', '', s) for s in strings]
['123', '345', '23']
Гораздо лучше, чем сгладить список матчей. +1 –
Ваше решение лучше, чем ответ chrisaycock, если только по той простой причине, что в Python 3.x фильтр возвращает итератор вместо строки. (Он использует промежуточный список вместо генератора). В Python 2.x преимущество - это чистая элегантность, вы можете просто сделать «filter (str.isalpha, s)», и он автоматически вернет строку без необходимости участия, потому что фильтр выполняет интеллектуальную проверку типов. – Shashank
Спасибо @ TigerhawkT3, я думаю, что буду использовать это. Но после этого мне нужна только одна строка, если есть одно и то же слово. Например, мне нужен только «ABCd», но есть 5 элементов «ABCd» в списке B, которые вы написали на самом деле. – kristofagotaa
Я обновил свой ответ, чтобы включить решения для удаления дубликатов, с сохранением и без сохранения первоначального порядка 'list'. – TigerhawkT3