簡體   English   中英

枚舉函數的驚人行為

[英]Surprising behaviour of enumerate function

我使用枚舉函數編寫了一些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個乘積。 這是怎么回事?

enumeratestart參數僅影響所產生的元組的第一個值(即ij ),而不影響枚舉從哪個索引開始。 手冊所述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)

這里的問題首先是枚舉做了什么,其次是為什么要使用它。 枚舉的基本功能是將(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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM