从数字中筛选列表的最pythonic方法是什么?

时间:2013-03-12 08:14:31

标签: python list

我有这个:

['SPRD', '60', 'p25']

我想生成:

['SPRD', 'p']

最狡猾的方式是什么?

感谢。

7 个答案:

答案 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)