python-3.x 如何生成一个所有数字都是偶数的数字列表?

2izufjch  于 2023-01-06  发布在  Python
关注(0)|答案(4)|浏览(197)

我有一个使用列表解析生成的数字列表,但是我想让python检查输出,并且只在数字中的每一位都是偶数(例如266)时才打印结果。如果数字是偶数,例如218,但是每一位都不能被2整除,那么它就不应该打印。有人能帮忙吗?
下面是我的代码:

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

2q5ifsrm1#

我建议你直接生成你想要的数字,而不是在之后过滤列表。函数itertools.product可以用来生成所有的suffices,(0, 0)(0, 2),......,等等。然后,只需将200添加到每个suffices中。

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))]

然后,如果您希望边界不那么清晰,可以在以后过滤结果。

ohfgkhjo

ohfgkhjo2#

带字符串和集合

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

>>> 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的精彩回答是迄今为止最快的:

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)

后跟string和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的回答:

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)

接下来是杰米·康塞尔的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)
iezvtpos

iezvtpos3#

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

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

xpcnnkqh

xpcnnkqh4#

如果列表解析不是必需的,下面的函数可以用来返回一个所有数字都是偶数的数字列表。

def only_even_digits_num(my_list):
my_list_cp = my_list.copy()
for num in my_list_cp:
    remove_flag = 0
    for i in str(num):
        if int(i)%2==0 and remove_flag==0:
            pass
        else:
            remove_flag = 1
            if num in my_list:
                my_list.remove(num)
return my_list

测试列表= [0、1、2、3、102、201、202、88、636]打印(仅偶数位数(测试列表))

退货
[0、2、202、88]
我试着用列表理解法来做,但没有成功。如果有人能做到,我会用信用和参考来进一步更新我的答案。

相关问题