2016-12-24 11 views
-1

ソートするデータを準備するためにいくつかのコード行。これを行うために、リストの各項目をリストにする必要がありました。たとえば、私のリストが[a, b, c, d]だった場合、リストは[[a], [b], [c], [d]]になります。ここで、a、b、c、およびdは整数です。私のコードは、しかし[[d], [d], [d], [d]]を返します。リストのすべての項目は同じですか?

len_of_list = random.randint(8500, 10000) 
val_list = range(len_of_list) 

list_one = [[-1]] 
for index in range(0, len_of_list): 
    list_one[0][0] = val_list[index] 
    val_list[index] = list_one[0] 
print val_list 

コードに起こる奇妙な事は最後から2番目の行がval_list[index] = list_one[0][0]に交換されたときに、それだけで[]せずに正しい値を返すことです。したがって、私は最後の[0]を取り除くと、それらの周りに[]の値を返すと仮定しました。しかし、返されるのは、元々[]で囲まれたリストの最後の整数で、の場合はすべての値です。これは、が毎回list[0][0] = val_list[index]でリセットされるために発生しません。

なぜリストは[[a], [b], [c], [d]]の代わりに[[d], [d], [d], [d]]として返されますか。もちろんリストには少なくとも8500の固有の整数がありますが、dはリストの最後の値を表します。単純にd = val_list[len(val_list) - 1]となります。

+2

あなたは同じリストのオブジェクトを再利用し続ける、あなたの代わりに* *コピーを作成したいと思います。 –

+0

Martijnの簡単な答えを広げる。外側のリストには* 1 *リストへの参照が8500件あります(これは繰り返し変更されています)。 –

+1

http:// pythontutorのコードを実行してください。com(短いリストで)あなたは何が起こっているか見るでしょう。 – furas

答えて

1

あなたはval_list[index]list_one[0]を置きます。 list_one[0]はリストなので、val_list[index]はその値ではなくそのアドレスを受け取ります。したがって、list_one[0]の値が変更された場合、つまり、すべての繰り返しで、indexごとにval_list[index]の値も変更されます。

したがって、リストのすべてのインデックスに含まれる最終値は、最後の値である[d]です。

これはlist_one[0]というリストであるために発生します。


あなたのコードは実際にはpythonicではありません。まず、val_list = range(len_of_list)と書いて、長さlen_of_listの空のリストを作成します。これはPython 2で動作しますが、rangeオブジェクトが意味的にリストと異なるため、Python 3ではありません。また、要素を追加または挿入することによってリストを構築する必要がありますが、十分な長さの空のリストを作成してからインデックスを埋め込むことはできません。

for index in range(len_of_list): 
    val_list[index] = [index] 

appendで、同じことを行うために、より基本的な神託の方法は、次のようになります:以下は十分だったでしょうしながら

、あなたは、リストのリストを構築するために複雑なコードを使用している

len_of_list = random.randint(8500, 10000) 
val_list = list() 

for index in range(len_of_list): 
    val_list.append([index]) 

しかし、最も無礼な方法はリストの理解を使用することです。あなたはl = [a, b, c, d]を持っている、とあなたは[[a], [b], [c], [d]]を持っているしたい場合は、fastesは以下の通りです:

[[elt] for elt in l] 
+0

良い答えが、私はまだ私のコードで何が問題なのか知りたいです –

+0

@PythonMaster私は私の答えを更新しました。私はあなたがこの出力を得ている理由を理解してくれることを願っています。 –

1

はこれを試してみてください:

[[x] for x in myList] 
+0

ニースの答えは、私はまだ私のcideで何が間違っているか知りたいです –

関連する問題