Python 如何生成所有数字都是偶数的数字列表?

Python 如何生成所有数字都是偶数的数字列表?,python,python-3.x,Python,Python 3.x,我有一个使用列表理解生成的数字列表,但希望python检查输出,并且仅当数字中的每个数字都是偶数(例如266)时才打印结果。如果数字是偶数,例如218,但每个数字不能被2整除,则不应打印。有人能帮忙吗 这是我的密码: jail=[res for res in range(200,300)if res % 2 ==0 ] print(jail) 有弦乐和布景 您可以定义一组可接受的数字,并过滤仅使用这些数字的整数: >>> allowed_digits = set('02468

我有一个使用列表理解生成的数字列表,但希望python检查输出,并且仅当数字中的每个数字都是偶数(例如266)时才打印结果。如果数字是偶数,例如218,但每个数字不能被2整除,则不应打印。有人能帮忙吗

这是我的密码:

jail=[res for res in range(200,300)if res % 2 ==0 ]
print(jail)
有弦乐和布景 您可以定义一组可接受的数字,并过滤仅使用这些数字的整数:

>>> 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]
它可以这样使用:

>>> [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的优秀作品是迄今为止最快的:

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\u-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)
后跟字符串和集合方法:

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)
其次是Jamie Counsell的:


这将保留原始列表,并单独打印每个编号:

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
表示进行迭代来获得。

我建议直接生成所需的数字,而不是随后过滤列表。函数
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))]

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

@Bahrom你的答案应该更好。我没有得到反对票,这里没有任何企图。提示:使用递归函数筛选列表。有人尝试了。好吧,它肯定会失败,但OP希望列表理解&考虑到限制因素,这不是小事。每个人都得到了很多反对票,可能是被所谓的python反对票警察因为“没有尝试”。我认为这太荒谬了,所以我在这里称赞了所有人,因为你有时能得到6张选票来回应血腥的明显…如果一些下层选民愿意发布一个精彩的答案,我们会很高兴地向上投票。非常好的方法,它比这里的其他答案快30到200倍。做得好!我不会把那一个投得更高,但它不应该得-1分。当人们没有好的理由或评论就否决投票时就会发生这种情况:他们会得到相反的效果。为什么不呢?对我来说,这似乎是最简单、最直接的解决方案。
jail=[res代表范围内的res(200300),如果all(int(digit)%2==0代表str(res))中的digit]
我同意这是一个更好的答案:紧凑且仍然可读。
jail = [res for res in range(200,300) if all(int(digit)%2 == 0 for digit in str(res))]
from itertools import product

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