我有一组由生成器生成的几千个素数:
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
我认为这是最好的方法,但如果我错了,我很好奇。
答案 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
集中删除101
和103
这样的数字,因为它们包含零位数。
你甚至不需要正则表达式。它可以通过简单的列表理解来完成:
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 每个循环
filter(lambda x: '0' not in str(x), primes)
1000次循环,最佳3次:963μs每次循环
def zero_membership_checker(num):
while num:
if num%10 == 0:
return True
num = num / 10
return False
1个循环,最好3个循环: 6.65 s 每个循环
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