2016-04-24 21 views
-2

私はちょうどパスカルの三角形から始めて、いくつかのpython演習で練習を始めました。 各行を格納するリストのリストを選択しました。以下は Pythonでリストのリストを操作する

は私のコードです:

import sys 

list = [] 

listoflists = [[1],[1,1]] 

def pascalgeneration(func_list, cur_row, total_row): 

    print("FUNCTION ENTERED\n CUR ROW \n TOTAL ROW",cur_row,total_row) 
    while (cur_row < total_row): 

     for iter in range(0, cur_row+1): 
      if (iter == 0): 
       func_list[cur_row].append(1) 
      elif(iter == cur_row): 
       func_list[cur_row].append(1) 
       func_list.append(list) 
       break 
      else: 
       print ("INSIDE ELSE BLOCK\n CUR_ROW \n TOTAL_ROW\n ITER VARIABLE",cur_row,total_row,iter) 
       func_list[cur_row].append(func_list[cur_row-1][iter-1]+\ 
               func_list[cur_row-1][iter]) 
     cur_row += 1 
    print (func_list) 

def main(): 

    no_rows = int(input("Enter the number of rows :")) 
     #print (type(no_rows)) 
    if (no_rows==1): 
     print (listoflists[0][0]) 
    elif(no_rows==2): 
     print (listoflists[1][0],listoflists[1][1]) 
    else: 
     listoflists.append(list) 
     pascalgeneration(listoflists,2,no_rows) 

    #print (listoflists) 

if __name__ == "__main__": 

    main() 

しかし、私はこのコードを実行すると、出力に含まはexepectedようではありません。

を入力とする5:

OUTPUTは

のようなものです
[[1], 

[1,1], 

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

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

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

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

] 

[ 

[1], 

[1,1], 

[1,2,1], 

[1,3,3,1], 

[1,4,6,4,1] 

] 

誰かが私にリストのリストの動作を説明できますか?

答えて

1

問題はあなたがそこに引数として変数listを入れているあなたのライン17 func_list.append(list)

です。問題は、あなたがそれをするとき、あなたが望むように、新しい空のリストを基本的に追加するのではなく、3行目で宣言したそのリストへのリンクです。つまり、func_list[cur_row].append(something)を実行するたびに、リスト。だからこそ、結果に長い同一のリストがたくさんあるのです(同じリストオブジェクトです)。

17,35行目でfunc_list.append([])に変更してください。多かれ少なかれ私のために働きます。サイドノート、

はあなたの変数名としてlistiterを使用しないでください。これらは組み込みのPython関数です。これを行うことで、それらをシャドーイングし、将来アクセスできないようにします。 (また、Pythonを使う人は、組み込み関数として見て、変数を変数として見るのは少し不快なので、よく混乱します)

そして、あまりテストされていないメモでは、 line 35 func_list.append([])とし、その行をif iter == 10:の直後に17行目から移動しました。そうすることで、結果の最後に不要な空のリストが作成されるのを避けることができます。

+0

また、変数名の使用に関する貴重な提案に感謝します:) – user3275349

関連する問題