这不是我遇到的确切问题,但它是一个容易理解的等价问题:假设您被要求找到从0到99的数字,这些数字可以被给定divisor_list中的所有数字整除。 这就是我一直能够想出的:
divisible_numbers = []
for i in range(100):
divisible_numbers.append(i)
for divisor in divisor_list:
if i % divisor != 0:
divisible_numbers.pop()
break
有没有更简洁的方法来做这件事? 我想过列表理解,但它是。。。 不漂亮(而且比必要时做了更多的比较):
divisible_numbers = [i for i in range(100)
if len([0 for divisor in divisor_list
if i % divisor != 0]) == 0]
请不要建议数学解决方案(我知道有一个简单的),这是关于控制流的,而不是手头的问题。
考虑使用numpy
对于示例数据:
import numpy as np
divisor_list=[3,5,7,9,11,15,18]
divisible_numbers=np.array(list(range(100)))
divisible_numbers=divisible_numbers[(divisible_numbers.reshape(-1,1)%divisor_list==0).any(axis=1)]
>>> divisible_number
[ 0 3 5 6 7 9 10 11 12 14 15 18 20 21 22 24 25 27 28 30 33 35 36 39
40 42 44 45 48 49 50 51 54 55 56 57 60 63 65 66 69 70 72 75 77 78 80 81
84 85 87 88 90 91 93 95 96 98 99]
回答我自己的问题:
divisible_numbers = [i for i in range(100) if all(i % divisor == 0 for divisor in divisor_list)]
似乎是最好的解决方案。
假设divisor_list=[6,9,69]
那你就可以
list(filter(lambda x: max(x%i == 0 for i in divisor_list), [i for i in range(1,100)]))
将返回
[6,9,12,18,24,27,30,36,42,45,48,54,60,63,66,69,72,78,81,84,90,96,99]