带有字符串和集合
您可以定义一组可接受的数字并过滤仅使用这些数字的整数:
>>> allowed_digits = set('02468')
>>> [i for i in range(200,300) if set(str(i)) <= allowed_digits]
[200, 202, 204, 206, 208, 220, 222, 224, 226, 228, 240, 242, 244, 246, 248, 260, 262, 264, 266, 268, 280, 282, 284, 286, 288]
所需的属性并不是真正为数字定义的,而是为它的十进制表示。我想说在这种情况下使用str() 是有意义的。
算术
还可以使用算术检查每个数字是否为偶数,例如使用递归函数:
def all_even(i):
if i == 0:
return True
return (i % 10) % 2 == 0 and all_even(i // 10)
print(all_even(123456))
# False
print(all_even(24680))
# True
可以这样使用:
>>> [i for i in range(200,300) if all_even(i)]
[200, 202, 204, 206, 208, 220, 222, 224, 226, 228, 240, 242, 244, 246, 248, 260, 262, 264, 266, 268, 280, 282, 284, 286, 288]
性能
Jared Goguen 的出色 answer 是迄今为止最快的:
In [46]: %timeit [int(''.join(t)) for t in product('02468', repeat=5)]
2.19 ms ± 12.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
这很有意义,因为它直接生成列表,无需过滤任何内容。
然后是all_even 方法:
In [17]: %timeit [i for i in range(100000) if all_even(i)]
69.5 ms ± 133 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
后跟字符串和set方法:
In [15]: %timeit [i for i in range(100000) if set(str(i)) <= allowed_digits]
104 ms ± 167 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
随后是@jmd_dk 的answer:
In [14]: %timeit [res for res in range(100000) if all(int(digit)%2 == 0 for digit in str(res))]
245 ms ± 1.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
随后是 Jamie Counsell 的answer:
In [16]: %timeit [res for res in range(1,100000) if all((int(res/math.pow(10, power) % 2) == 0) for power in range(0, int(math.log10(res)) + 1))]
447 ms ± 2.02 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)