删除包含特定char的集合的所有元素

时间:2016-03-08 21:01:55

标签: python set

我有一组由生成器生成的几千个素数:

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

我认为这是最好的方法,但如果我错了,我很好奇。

5 个答案:

答案 0 :(得分:8)

您可以使用集合理解来过滤现有的素数集。

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

答案 1 :(得分:3)

免责声明:绝对不知道您想要做什么或为什么这会有用。我只是假设您要从 SELECT COUNT(DISTINCT client_name) AS num_client, client_name, prod_id FROM TAB_CLIENT INNER JOIN TAB_PROD ON prod_client = client_name 集中删除101103这样的数字,因为它们包含零位数。

你甚至不需要正则表达式。它可以通过简单的列表理解来完成:

primes

Kasramvd's answer可能会更快,你应该测试两者。

我不确定你的集合只是一个例子,或者你是否计划使用生成器生成可能无限的素数列表。在后一种情况下,您可以使用# 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) 懒惰地定义过滤后的序列(也就是说,当您要求它而不是使用整个列表时,只生成下一个元素):

itertools

等等,我忘了,这应该产生相同的结果,但代码更少(我将保留旧解决方案的完整性):

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

答案 2 :(得分:1)

总结和计时回复:

首批100000素数。 (使用timeit并每次复制素数集)

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

10个循环,最好3个循环: 29.6 ms 每个循环

麦克

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

10个循环,最好3个循环: 38.9 ms 每个循环

Garrett R

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

1000次循环,最佳3次:963μs每次循环

Kasramvd

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

1个循环,最好3个循环: 6.65 s 每个循环

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 ms 每个循环

答案 3 :(得分: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])

答案 4 :(得分: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