使用if语句增加理解变量?

时间:2018-05-11 16:27:56

标签: python python-3.x list list-comprehension

我正在努力学习Python理解,但我被困住了。我正在尝试在条件为count时增加True变量,并在循环后计算return。这是我的代码:

list = [1,2,4,5,7,8,10]
d = 3
count = 0
return [count for x in range(len(list))
        if list[x] + d in list and list[x] + 2 * d in list]

每次条件为"0"时,它都会返回True。当我尝试在理解中添加count += 1时,它会给我一个SyntaxError

5 个答案:

答案 0 :(得分:6)

Comprehensions不这样做。从概念上讲,它们允许您设置和过滤列表中的各个元素,而不是累积到单个变量中。

虽然有一个标准的习惯用于解决这个问题。你基本上可以为你的条件制作一个可迭代的布尔值,或者只保留你想要的所有元素并放弃其他元素,然后再sum

作为进一步的改进,我建议使用generator expression而不是列表理解。它看起来几乎相同,但支持懒惰的评估。这意味着您可以获得单行的所有好处,而无需将标志值列表存储在内存中。

以下是第一个选项的外观:

L = [1,2,4,5,7,8,10]
count = sum((x + d in L and x + 2 * d in L) for x in L)

第二个选项如下:

L = [1,2,4,5,7,8,10]
count = sum(1 for x in L if (x + d in L and x + 2 * d in L))    

请注意,我已将变量list重命名为L,因此不会影响内置函数。

答案 1 :(得分:3)

不?

group by *

group by _ALL_

group by 1:250

或使用len:

for x in lst:
    if x+d in lst and x+2*d in lst:
        count += 1

或者使用sum:

count = len([_ for x in lst if x+d in lst and x+2*d in lst])

或使用套装(准备惊讶):

count = sum(1 for x in lst if x+d in lst and x+2*d in lst)

以下是1000个连续数字列表中的表现数字:

count = len(({x + d for x in lst} | {x + 2 * d for x in lst}) & set(lst))

这不是性能的保证。在这种情况下,集合也可能是内存效率最低的解决方案。但它确实有效(看起来非常好)。

另外,不要命名变量loop: 20.3 ms ± 8 ms len: 25.4 ms ± 8.22 ms sum: 18.3 ms ± 5.06 ms sets: 272 µs ± 19 µs (~100x faster) ,这是Python中的内置函数并覆盖它会导致各种混乱。

答案 2 :(得分:2)

你非常接近。列表推导不能以您希望的方式存储和重用变量;它们可能只包含表达式。一种解决方案是将sum与生成器表达式一起使用。

此解决方案的好处是您可以避免构建列表的费用,这不需要计算满足条件的元素数量。

A = [1,2,4,5,7,8,10]
A_set = set(A)

d = 3
count = 0

res = sum(1 for x in range(len(A)) if \
          (A[x]+d in A_set) and (A[x]+2*d in A_set))

# 3

请注意,您不应该在课后命名变量。此外,您可以使用set进行O(1)查找。

另请注意,我们在列表推导之外构造A_set,否则将针对range(len(A))的每次迭代计算它。

答案 3 :(得分:2)

list = [1,2,4,5,7,8,10]

d = 3

# python 3 required for _
result = len([_ for x in range(len(list))
                if list[x]+d in list and list[x]+2*d in list])
# python 2
result = len([1 for x in range(len(list))
                if list[x]+d in list and list[x]+2*d in list])

答案 4 :(得分:1)

如果您只需要发生的次数,请返回列表的长度:

len([count for x in range(len(list)) 
           if list[x]+d in list and list[x]+2*d in list])

请记住,这是列表理解;你不能添加任意动作,例如作业。