什么是正确的列表理解语法

时间:2015-10-02 22:10:49

标签: python

如果我有两个清单:

e = [3,1,5,8]w = [1,2,4]

我想进入并检查e的哪个元素可以被w的每个元素整除,我该如何在列表理解中执行此操作? 所以使用我的两个列表,应该返回8,因为8 % each i in w将给出零。

就for循环而言,我想的是:

for i in e:
    for j in w:
        if i % j == 0:
            print i

但即使这是不正确的!

3 个答案:

答案 0 :(得分:5)

[i for i in e if all(i % j == 0 for j in w)]

答案 1 :(得分:1)

检查e的哪个元素可以被w的每个元素整除:

#!/usr/bin/env python
import fractions
import functools

e = [3,1,5,8]; w = [1,2,4]
lcm = functools.reduce(lambda a,b: a*b // fractions.gcd(a, b), w)
result = [i for i in e if i % lcm == 0]
# -> [8]

这是线性算法(如果数字有限),而不是嵌套列表理解,即二次算法,例如,如果ew每个包含一百万个数字,那么线性算法将需要即使在适度设备上也应该快速运行一百万次操作,同时二次算法需要〜1e12(一个12个零的数字)操作可能需要一段时间。

一般来说,如果你看到:

L = []
for i in e:
    for j in w:
        if i % j == 0:
             L.append(i)

然后它相当于:

L = [i for i in e for j in w if i % j == 0]

即,您只需要删除冒号并添加括号 - 顺序完全相同。

如果您需要找出列表推导的正确语法,那么这意味着您应该将代码保留为显式嵌套循环。

答案 2 :(得分:0)

如果一个数字可以被数字列表中的每个元素整除,那么它也必须与列表中所有数字的乘积一致。

e = [3,1,5,8, 16, 32]
w = [1,2,4]


product = reduce(lambda a,b: a*b, w)

answer = [i for i in e if i % product == 0]

# print answer  ->  [8, 16, 32]