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)
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)
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
4条答案
按热度按时间2q5ifsrm1#
我建议你直接生成你想要的数字,而不是在之后过滤列表。函数
itertools.product
可以用来生成所有的suffices,(0, 0)
,(0, 2)
,......,等等。然后,只需将200
添加到每个suffices中。这在某种程度上是可扩展的。假设您只想生成所有四位数-从2000开始到4888结束的偶数,那么您可以用途:
然后,如果您希望边界不那么清晰,可以在以后过滤结果。
ohfgkhjo2#
带字符串和集合
您可以定义一组可接受的数字,并过滤只使用这些数字的整数:
所需的属性不是为数字定义的,而是为它的十进制表示定义的,我认为在这种情况下使用
str()
是有意义的。∮用算术∮
也可以使用算术来检查每个数字是否为偶数,例如使用递归函数:
它可以这样使用:
性能
Jared Goguen的精彩回答是迄今为止最快的:
这是有意义的,因为它直接生成列表,而不必过滤任何内容。
接下来是
all_even
方法:后跟string和set方法:
后面跟着@jmd_dk的回答:
接下来是杰米·康塞尔的answer
iezvtpos3#
这将使原始列表保持原样,并单独打印每个编号:
如果您只想在
jail
列表中使用这些特殊数字,只需在创建列表时添加条件:这些解决方案依赖于这样的事实,即每个数字都可以通过对整数的
str
表示进行迭代来获得。xpcnnkqh4#
如果列表解析不是必需的,下面的函数可以用来返回一个所有数字都是偶数的数字列表。
测试列表= [0、1、2、3、102、201、202、88、636]打印(仅偶数位数(测试列表))
退货
[0、2、202、88]
我试着用列表理解法来做,但没有成功。如果有人能做到,我会用信用和参考来进一步更新我的答案。