2

我有这个 :

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

我想生成:

['SPRD', 'p']

最pythonic的方法是什么?

谢谢。

4

7 回答 7

4
digits_stripped = (s.translate(None, '0123456789') for s in input_list)
without_blanks = [s for s in digits_stripped if s]

(请注意,如果您碰巧使用的 Python 版本早于 2.6,则需要使用string.maketrans('', '')而不是None作为 . 的第一个参数translate()。)

于 2013-03-12T08:19:32.350 回答
3
In [25]: l = ['SPRD', '60', 'p25']

In [26]: filter(None,(s.translate(None,'1234567890') for s in l))
Out[26]: ['SPRD', 'p']
于 2013-03-12T08:31:12.813 回答
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']
于 2013-03-12T08:19:39.480 回答
1
import re
filter(None, [re.sub("\d+", "", f) for f in input_list])

我相信这是非常pythonic,尽管它确实需要正则表达式并且不如其他答案那么有效。首先,从单词中删除所有数字,然后从列表中删除任何空字符串。

于 2013-03-12T08:20:42.697 回答
0

使用生成表达式、正则表达式、列表推导:

import re
[s for s in (re.sub("[0-9]*", "", s) for s in l) if s]
于 2013-03-12T08:24:18.877 回答
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 != '']
于 2013-03-12T08:28:13.417 回答
0

根据之前的回答,强制转换应该比正则表达式或字符串操作更快、更“漂亮”。

那么最好的方法应该是这样的:

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)
于 2013-03-12T09:45:00.190 回答