2016-03-08 7 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 мс на петлю

Mike

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

10 петель , лучше всего 3: 38,9 мс на петлю

Гаррета R

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, вам не нужен список (р) часть. 'if '0' в p' будет работать без преобразования –

+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

Отказ от ответственности: У меня есть абсолютно понятия не имеет, что вы хотите делать с этим или почему это было бы полезно.Я просто предполагаю, что вы хотите удалить цифры, такие как 101 и 103 из вашего primes, потому что они содержат нулевую цифру.

Вам даже не нужны регулярные выражения. Это может быть сделано с помощью простого списка понимания:

# 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 может быть быстрее, вам следует проверить и вне.

Я не уверен, что ваш набор является просто примером или если вы планируете использовать генератор для создания, возможно, бесконечного списка простых чисел. В последнем случае, вы можете использовать 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 
Смежные вопросы