簡體   English   中英

從數字中篩選列表的最pythonic方法是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM