![](/img/trans.png)
[英]How can I write the following code in a more efficient and pythonic way?
[英]How can I write more “pythonic” when coding like the following?
res = sum((i+j)%k == 0 for x, i in enumerate(a) for j in a[x+1:])
其中a是一个数组。
我无法理解这段代码在做什么.. i in enumerate(a) for j in a[x+1:]
基本上是为了节省空间而在该行内的for循环?
另外我怎么写这样的代码? 我正在努力学习python。
这是对sum
函数调用内的生成器表达式。 sum
只是添加了东西,所以让我们看一下生成器表达式:
(i+j)%k == 0 for x, i in enumerate(a) for j in a[x+1:]
(i+j)%k == 0
部分是布尔表达式。 如果i+j
在被k
潜水时具有0
的余数,则为真,否则为假。 作为一个巧妙的小技巧, True
值在python中的数值为1
,而False
的数值为0
。 所以这基本上只算数。
for x, i in enumerate(a) for j in a[x+1:]
这本质上是一个嵌套的for循环。
for x, i in enumerate(a):
for j in a[x+1:]:
enumerate
是一个从迭代与其索引配对产生项的函数,因此[a, b, c]
变为[(0, a), (1, b), (2, c)]
将它们全部粘在一起,并且此代码计算列表中元素对的数量,使得它们的总和可被k
整除
您可以按如下方式“展开”代码:
counter=0 # emulates `sum`
for x, i in enumerate(a):
for j in a[x+1:]:
counter += (i+j)%k == 0
所以计算(i+j)
出现可以被k
整除,避免计算相同的一半和相同的元素(只计算上面的矩阵三角形)
当您从另一个可迭代或可迭代迭代中创建列表时,列表/生成器理解更好/更快,更简洁,如下所示:您创建了一个布尔值列表(0或1),您可以将它们sum
加以计算True
的出现次数。
但是不要滥用它们: 正确使用列表推导 - python
有时一个简单的循环调用n次函数会更好(当需要副作用时)。
如果使用不明智,他们可能会成为一个理解的噩梦(特别是其中有副作用的单行)
这些被称为理解。 enumerate
遍历可迭代对象并返回元组(a, b)
,其中a
是可迭代中的索引, b
是该索引处的对象。
这是一个很好的pythonic代码。 至于学习如何理解/写这样的东西,练习和阅读python文档将是一个很好的起点。 请记住,这只是语法糖,你可以在多行中做同样的事情,它几乎完全相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.