提问者:小点点

如何根据索引与列表中每个项目的匹配条件来筛选索引?


这不是我遇到的确切问题,但它是一个容易理解的等价问题:假设您被要求找到从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]

请不要建议数学解决方案(我知道有一个简单的),这是关于控制流的,而不是手头的问题。


共3个答案

匿名用户

考虑使用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]