2016-10-03 3 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、* 5 2、2 * 7、* 5 3、* 7 3、代わりに5 * 7

を、それが全ての可能な16個の製品を計算します。どうしたの? enumerate

答えて

2

ここで問題が何をしたか列挙まずあり、そして第二に、なぜあなたはそれを使用している:

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

は何がしたいことはこれです:the manualはそれを置くとして、enumerateはこれに相当します。 enumerateの基本機能は、(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は、私たちは同様にGoogleのインデックスとして、その値を使用することができます:

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

startパラメータは単に得タプル(すなわちij)の最初の値に影響を与え、それが列挙を開始するインデックス位置に影響しません。

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

おかげで、私は参照してください。間違いなくその機能が誰かにとって有用であることは間違いない。名前の選択は不幸です。 msgstr "" "列挙の開始パラメータは列挙が始まるインデックスに影響しません。" –

関連する問題