如何生成所有数字均匀的数字列表?

时间:2017-11-06 21:12:43

标签: python python-3.x

我有一个使用列表推导生成的数字列表,但是想让python检查输出,只有当数字中的每个数字都是偶数时才打印结果(例如266)。如果数字是偶数,例如218,但每个数字不能被2整除,那么它不应该打印。有人可以帮忙吗?

这是我的代码:

jail=[res for res in range(200,300)if res % 2 ==0 ]
print(jail)

3 个答案:

答案 0 :(得分:3)

使用字符串和集合

您可以定义一组可接受的数字,并过滤仅使用这些数字的整数:

>>> 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&#39; s 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)

答案 1 :(得分:3)

我建议您直接生成所需的数字,而不是之后过滤列表。函数itertools.product可用于生成所有足够的内容,(0, 0)(0, 2),...等。然后,只需为每个人添加200

from itertools import product

vals = [200 + int(''.join(t)) for t in product('02468', repeat=2)]

这有点可扩展。假设您想生成从2000开始到4888结尾的所有四位数偶数,那么您可以使用:

vals = [int(''.join(t)) for t in product(*(('24',) + ('02468',) * 3))]

如果你想要更少的干净边界,你可以在之后过滤结果。

答案 2 :(得分:1)

这将原始列表保留为原样,并自行打印每个数字:

jail = [res for res in range(200,300)if res % 2 ==0 ]
for number in jail:
    if all(int(digit)%2 == 0 for digit in str(number)):
        print(number)

如果您只想在jail列表中使用这些特殊数字,只需将条件放入列表的创建中:

jail = [res for res in range(200,300) if all(int(digit)%2 == 0 for digit in str(res))]

这些解决方案依赖于这样一个事实:每个数字都可以通过整数str表示的迭代来获得。