2016-03-08 141 views
4

我有一組從生成器生成的幾千個素數的一組中的所有元素:刪除包含特定字符

primes = set(primegen()) = set([..., 89, 97, 101, 103, ...]) 

其中一些素數中都有一個零。我想擺脫他們。有沒有辦法一次完成這一切?

目前,我過的素數刪除元素,因爲我循環,用正則表達式匹配:

import re 
zero = re.compile('.+0.+') 

while primes: 
    p = str(primes.pop()) 
    if zero.match(p): 
     continue 
    # do other stuff 

我覺得這是最好的辦法,但很好奇,如果我錯了。

回答

1

總結和時序的響應:

隨着第100000個素數。 (使用timeit和複製素數每次設定)

primes = {p for p in primes if '0' not in str(p)} 

10個循環,最好的3:29.6毫秒每個環路

麥克

while primes: 
    p = str(primes.pop()) 
    if '0' in p: 
     continue 
    # do other stuff 

10環,最好的3:38.9 ms per loop

蓋瑞特ř

filter(lambda x: '0' not in str(x), primes) 

1000個循環,最好的3:963微秒每個環路

Kasramvd

def zero_membership_checker(num): 
    while num: 
     if num%10 == 0: 
      return True 
     num = num/10 
    return False 

1個環路,最好3:6.65小號每循環

hiyume

import re 
zero = re.compile('.+0.+') 

while primes: 
    p = str(primes.pop()) 
    if zero.match(p): 
     continue 
    # do other stuff 

10圈,最好的3:69.4毫秒每個循環

+0

只是fyi,你不需要列表(p)的一部分。 'p'中的'0'將在沒有轉換的情況下工作 –

+0

您是對的!它甚至更快 – Mike

8

您可以使用一組理解來過濾現有的素數集。

primes = {p for p in primes if '0' not in str(p)} 
1

你並不需要將數字轉換爲字符串,並使用正則表達式來匹配它的零(或更好的,它使用in操作員進行會員資格檢查),這是一項昂貴的操作,尤其是當您處理大型數據集時。您可以使用下面的函數來檢測是否有你的號碼中的任意爲零,則使用了一套修真內保持預期的數字:

>>> def zero_membership_checker(num): 
...  while num: 
...   if num%10 == 0: 
...    return True 
...   num = num/10 
...  return False 
... 
>>> s = set([89, 97, 101, 103]) 
>>> 
>>> {i for i in s if not zero_membership_checker(i)} 
set([89, 97]) 
3

免責聲明:絕對不知道你想什麼這樣做或爲什麼這將是有用的。我只是假設你想從你的primes集合中刪除像101103這樣的數字,因爲它們包含一個零數字。

你甚至不需要regexes。它可以用一個簡單的列表理解來完成:

# assume that primes is defined 
str_primes = map(str, primes) 
filtered_str_primes = [p for p in primes if "0" not in p] 
filtered_primes = map(int, primes) 

Kasramvd's answer可能會更快,你考768,16雙雙出局。

我不確定您的設置是否僅僅是一個示例,或者您打算使用生成器生成可能無限的素數列表。在後一種情況下,你可以使用itertools懶洋洋地定義過濾序列(即,當你問它,而不是消費的整個列表只會產生下一個元素):

from itertools import imap, ifilter 
filtered_primes = imap(int, 
         ifilter(lambda p: "0" not in p, 
           imap(str, primes))) 

等待,我忘了,這應該產生相同的結果,但用更少的代碼(我會留下的完整性上了年紀的解決方案):

filteres_primes = (p for p in primes if "0" not in str(p)) 
1

filter也適用於這種應用:

In [25]: primes = set([83, 89, 97, 101, 103]) 

In [26]: filter(lambda x: '0' not in str(x), primes) 
Out[26]: [89, 83, 97] 

這裏有一些時間信息,對於任何人都好奇

In [37]: %timeit filter(lambda x: '0' not in str(x), myList) 
10 loops, best of 3: 23.7 ms per loop 

In [38]: %timeit {p for p in myList if '0' not in str(p)} 
10 loops, best of 3: 22 ms per loop