我有一个很长的列表:=
如何只获得没有数字的字母部分并将其作为另一个列表?
答案 0 :(得分:3)
>>> [''.join([l for l in x if l.isalpha()]) for x in xs]
['ABCd', 'Efhgh', 'dhAsadjkhdk']
答案 1 :(得分: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']
答案 2 :(得分: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']
答案 3 :(得分:0)
>>> values = ['ABCd 123', 'Efhgh 345', 'dhAsadjkhdk 23']
>>> [value.split()[0] for value in values]
['ABCd', 'Efhgh', 'dhAsadjkhdk']
答案 4 :(得分:0)
使用正则表达式搜索列表中的字母组:
words = map(lambda s: re.findall(r'[a-zA-Z]+', s), A)
words = list(itertools.chain.from_iterable(words))