bugfix> python > 投稿

私はハッカーランクからいくつかの質問をしようとしていて、この質問に出会いました https://www.hackerrank.com/challenges/list-comprehensions/problem

私はこの解決策を試しました

if __name__ == '__main__':
x = int(input())
y = int(input())
z = int(input())
n = int(input())
L = []
SL = []
for i in range(0, x + 1):
    for j in range(0, y + 1):
        for k in range(0, z + 1):
            if i + j + k != n:
                SL[:] = []
                SL.append(i)
                SL.append(j)
                SL.append(k)
                print(SL)
                L.append(SL)
print(L)

SLには正しい解決策がありましたが、何らかの理由でSLをメインリストLに追加することはできません。明らかに、L.append(SL)は、SLの最後の値を印刷するときに実行するたびにリストLを上書きします なぜ起こるのですか? extendを使用してみましたが、リストのリストにする代わりに、単なる整数のリストとして作成しました。 編集:説明してくれてありがとう!

回答 2 件
  • 確かにあなたのコードは機能せず、それは行 SL[:] = [] によるものです : SL が参照するリストの内容を変更します 。これにより、 L のすべての要素を変更します 、常に SL によって参照されるリストを追加するため   L へ  ループの中。 SL = [] に置き換える  この場合、前のリストを上書きせずに新しいリストを作成するため、問題が修正されます。
    次の提案により、修正することができ、さらに読みやすく、必要に応じてデバッグしやすくなります。

    L = []
    for i in range(0, x + 1):
        for j in range(0, y + 1):
            for k in range(0, z + 1):
                if i + j != n and i + k != n and k + j != n and i + j + k != n:
                    L.append([i, j, k])
    print(L)
    
    

    x = 1、y = 2、z = 3、n = 4の場合、次の出力が得られます。

    [[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 0, 3], [0, 1, 0], [0, 1, 1], [0, 1, 2], [0, 2, 0], 
     [0, 2, 1], [0, 2, 3], [1, 0, 0], [1, 0, 1], [1, 0, 2], [1, 1, 0],  [1, 1, 1], [1, 2, 0]]
    
    

  • この行は、すべてのアイテムを削除してリストをクリアします。リストは同じ変数(同じオブジェクト)のままで、その内容のみが変更されます:

    SL[:] = []
    
    

    コードの後半には次の行があります(ループ内):

    L.append(SL)
    
    

    ただし、SLは毎回同じ変数です。 L のすべてのアイテム  同じリスト SL を参照 。だから SL  変更され、 L のすべてのアイテム   SL の新しいコンテンツを参照してください 。

    これは、結果ごとに新しいリストを作成することで修正できます。

あなたの答え