我正在努力学习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
。
答案 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])
请记住,这是列表理解;你不能添加任意动作,例如作业。