2015-05-14 2 views

ответ

2
>>> 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'] 
+0

Ваше решение лучше, чем ответ chrisaycock, если только по той простой причине, что в Python 3.x фильтр возвращает итератор вместо строки. (Он использует промежуточный список вместо генератора). В Python 2.x преимущество - это чистая элегантность, вы можете просто сделать «filter (str.isalpha, s)», и он автоматически вернет строку без необходимости участия, потому что фильтр выполняет интеллектуальную проверку типов. – Shashank

+0

Спасибо @ TigerhawkT3, я думаю, что буду использовать это. Но после этого мне нужна только одна строка, если есть одно и то же слово. Например, мне нужен только «ABCd», но есть 5 элементов «ABCd» в списке B, которые вы написали на самом деле. – kristofagotaa

+0

Я обновил свой ответ, чтобы включить решения для удаления дубликатов, с сохранением и без сохранения первоначального порядка 'list'. – TigerhawkT3

3
>>> [''.join([l for l in x if l.isalpha()]) for x in xs] 
['ABCd', 'Efhgh', 'dhAsadjkhdk'] 
+0

pythonic overkill :) – bagrat

+0

Вам не нужно создавать промежуточный список, str.join работает над любым итерабельным. – Shashank

0
>>> values = ['ABCd 123', 'Efhgh 345', 'dhAsadjkhdk 23'] 

>>> [value.split()[0] for value in values] 
['ABCd', 'Efhgh', 'dhAsadjkhdk'] 
+1

Это предполагает определенную структуру, которая не была упомянута или подтверждена и может быть случайной. – TigerhawkT3

+1

@ TigerhawkT3 нужно больше тестовых случаев. –

0

Используйте регулярные выражения для поиска групп букв в списке:

words = map(lambda s: re.findall(r'[a-zA-Z]+', s), A) 
words = list(itertools.chain.from_iterable(words)) 
2

Использование 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

Гораздо лучше, чем сгладить список матчей. +1 –

Смежные вопросы