[英]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.