2016-10-03 62 views
0

我使用枚舉函數編寫了一些Python代碼。枚舉函數的令人驚訝的行爲

A = [2,3,5,7] 

for i, x in enumerate(A): 
    # calculate product with each element to the right 
    for j, y in enumerate(A, start=i+1): 
     print(x*y) 

我預期它來計算6種產品:2 * 3,2 * 5,2 * 7,3 * 5,3 * 7,5 * 7

相反,它計算出所有可能的16個產品。這是怎麼回事?

回答

2

這裏的問題是什麼,首先羅列做,其次你爲什麼使用它。枚舉的基本功能是將形式爲(a,b,c)的迭代器轉換爲形式爲((start,a), (start+1,b), (start+2,c))的迭代器。它增加了一個通常用作索引的新列;在你的代碼中,這是ij。它不會更改序列中包含的條目。

我相信你是有意在操作切片,提取列表中的一部分:

for i, x in enumerate(A): 
    for y in A[i+1:]: 
    print(x*y) 

如果沒有複製的清單(它很少是)是很重要的,你可以用itertools.islice(A, i+1, len(A))取代A[i+1:]

備註是start參數在此代碼的外循環中可能很有用。我們只使用i+1,不i所以我們不妨使用該值作爲我們的索引:

for nextindex, x in enumerate(A, 1): 
    for y in A[nextindex:]: 
    print(x*y) 
7

enumeratestart參數僅影響產生的元組(即ij)的第一個值,它不影響枚舉開始的索引。作爲the manual所說的那樣,enumerate是相同的:

def enumerate(sequence, start=0): 
    n = start 
    for elem in sequence: 
     yield n, elem 
     n += 1 

你想要的是這樣的:

for i, x in enumerate(A): 
    for y in A[i + 1:]: 
     print(x * y) 
+0

謝謝,我明白了。毫無疑問,該功能對某人有用。名字的選擇是不幸的。 「枚舉的開始參數不影響枚舉開始的索引。」 –

相關問題