我有一个使用列表推导生成的数字列表,但是想让python检查输出,只有当数字中的每个数字都是偶数时才打印结果(例如266)。如果数字是偶数,例如218,但每个数字不能被2整除,那么它不应该打印。有人可以帮忙吗?
这是我的代码:
jail=[res for res in range(200,300)if res % 2 ==0 ]
print(jail)
答案 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
表示的迭代来获得。