![](/img/trans.png)
[英]What's the most Pythonic way to remove a number from start of a string?
[英]What is the most pythonic way to filter list from number?
我有這個 :
['SPRD', '60', 'p25']
我想生成:
['SPRD', 'p']
什么是最pythonic的方式呢?
謝謝。
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()
的第一個參數。)
In [25]: l = ['SPRD', '60', 'p25']
In [26]: filter(None,(s.translate(None,'1234567890') for s in l))
Out[26]: ['SPRD', 'p']
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']
import re
filter(None, [re.sub("\d+", "", f) for f in input_list])
我相信這是相當pythonic,雖然它確實需要正則表達式,並不像其他答案那樣有效。 首先,從單詞中刪除所有數字,然后從列表中刪除任何emptystrings。
使用生成表達式,正則表達式,列表推導:
import re
[s for s in (re.sub("[0-9]*", "", s) for s in l) if s]
如果您的列表只包含字符串,並且您只想過濾掉數字,那么無論多么笨重,它都可以起作用:
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 != '']
根據之前的回答 ,演員應該比正則表達式或字符串操作更快更“漂亮”。
這樣做的最佳方法應該是這樣的:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.