我有这个:
['SPRD', '60', 'p25']
我想生成:
['SPRD', 'p']
最狡猾的方式是什么?
感谢。
答案 0 :(得分:4)
digits_stripped = (s.translate(None, '0123456789') for s in input_list)
without_blanks = [s for s in digits_stripped if s]
(请注意,如果您碰巧使用的是2.6之前的Python,则需要使用string.maketrans('', '')
代替None
作为translate()
的第一个参数。)
答案 1 :(得分:3)
In [25]: l = ['SPRD', '60', 'p25']
In [26]: filter(None,(s.translate(None,'1234567890') for s in l))
Out[26]: ['SPRD', 'p']
答案 2 :(得分:1)
In [37]: l = []
In [38]: p = "[a-zA-Z]*"
In [39]: p1 = re.compile(p)
In [40]: for i in ['SPRD', '60', 'p25']:
....: if p1.match(i):
....: l.append(p1.match(i).group())
....:
In [41]: [x for x in l if x]
Out[41]: ['SPRD', 'p']
答案 3 :(得分:1)
import re
filter(None, [re.sub("\d+", "", f) for f in input_list])
我认为这是相当pythonic,虽然它确实需要正则表达式,并没有其他答案那么有效。首先,从单词中删除所有数字,然后从列表中删除任何emptystrings。
答案 4 :(得分:0)
使用生成表达式,正则表达式,列表推导:
import re
[s for s in (re.sub("[0-9]*", "", s) for s in l) if s]
答案 5 :(得分:0)
如果您的列表中只包含字符串,并且您只想过滤掉数字,那么无论多么笨重,它都可以起作用:
def filter_text(x):
try:
int(x)
return ''
except ValueError:
return x
l = ['SPRD', '60', 'p25']
newlist = []
for x in l:
newlist.append(''.join([filter_text(y) for y in x]))
newlist = [x for x in newlist if x != '']
答案 6 :(得分:0)
根据previous answer,施法应该比正则表达式或字符串操作更快更“漂亮”。
这样做的最好方法应该是这样的:
def is_number(s):
try:
float(s)
return True
except ValueError:
return False
#with list comprehension
def filter_number(seq):
return [item for item in seq if not is_number(item)]
#with a generator
def filter_number_generator(seq):
for item in seq:
if not is_number(item): yeld item
如果您的目标是在内存中包含列表的副本,则应使用列表推导方法。现在,如果您想有效地迭代列表中的每个非数字项,生成器允许您执行以下操作:
for non_number in filter_number_generator(l)