2016-03-04 37 views
1

我在hackerrank上看到过很多像这样的循环,但我仍然不明白它们是如何工作的。为什么它有一个常量整数'1'?它不应该是'我'而不是'1'吗?任何人都可以向我解释这一点。请解释这个计算为数组的python循环,并且是sum()ed

sum (1 for i in l if i >= a and i <= b) 

信贷到期的贷方。我将这个循环从一个非常优雅的解决方案复制到Shashwat的一个问题。问题在于“夏洛克和方形”在hackerrank算法中是好奇的。

+0

试着将其分解为两个步骤并将中间结果打印到终端或解释器中。 'list_to_sum = [1 for i in l if i> = a and i <= b]'这就是传递给'sum'的东西。 –

+0

它正在计数符合该条件的列表元素。如果这对你更有意义,你可以将其重写为'sum(bool(a <= i <= b)for i in l)'。 – dawg

+4

'sum(1,如果a <= i <= b)'我稍微更习惯于 –

回答

1

在你的例子中,如果项目大于或等于a且项目小于或等于b,则他们基本上为l中的每个项目添加1。

这基本上等于该代码:

x = [] 
for i in l: 
    if i >=a and i <= b: 
     x.append(1) 
sum(x) 
1
sum (1 for i in l if i >= a and i <= b) 

这是什么做的,是要创建仅当条件i >= a and i <= b通行证在遍历li是你1S的生成器表达式迭代器。

然后,sum将所有的1加在一起。

2

我不知道你的价值,从而让我们假设:

>>> l = list(range(10)) 
>>> a = 4 
>>> b = 7 

如果你的代码行分解成几个步骤,并打印中间结果它更清晰:

>>> [1 for i in l if i >= a and i <= b] 
[1, 1, 1, 1] 

这是传递给sum的内容。 (当你离开关方括号它含蓄地变成一台发电机,但是这是它看起来像一个列表。)

如果你不明白的理解,这是相同的:

>>> result = [] 
>>> for i in l: 
... if i >= a and i <= b: 
...  result.append(1) 
... 
>>> result 
[1, 1, 1, 1] 

总和将相当于将result = []更改为result = 0result.append(1)result += 1