2017-01-10 1 views
0

私は、さまざまなクラスに関する情報でいっぱいのclassarrayという大きなネストループを持っています。最初の2つのネストループインデックスのデータが同じであれば、同じクラスのクラスを結合しようとしています。新しい変数を別の変数の実際の値に設定するにはどうしたらいいですか?

[['AAS', '100', 'Intro Asian American Studies', '0', '12', '8', '5', '1', '3', '0', '0', '0', '0', '0', '0', '0', 'S-15'] 
['AAS', '100', 'Intro Asian American Studies', '1', '10', '4', '3', '6', '0', '1', '2', '0', '0', '0', '0', '0', 'S-15'] 
['AAS', '100', 'Intro Asian American Studies', '1', '7', '6', '7', '4', '1', '0', '1', '0', '0', '0', '0', '0', 'S-15'] 
['AAS', '120', 'Intro to Asian Am Pop Culture', '6', '7', '5', '2', '0', '3', '3', '0', '1', '0', '0', '0', '1', 'S-15'] 
['AAS', '215', 'US Citizenship Comparatively', '1', '3', '5', '4', '1', '6', '1', '3', '2', '1', '1', '1', '0', 'F-15'] 
['AAS', '258', 'Muslims in America', '0', '19', '2', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'S-16'] 
['AAS', '365', 'Asian American Media and Film', '1', '4', '6', '4', '5', '1', '3', '2', '2', '0', '0', '1', '0', 'S-16'] 
['AAS', '365', 'Asian American Media and Film', '6', '15', '0', '0', '1', '0', '3', '1', '1', '0', '0', '0', '2', 'S-15']] 

私は、行を結合し、new_arrayと呼ばれる新しい配列を生成しようとするために、次のコードを書いている:

itemx = ['','','',0,0,0,0,0,0,0,0,0,0,0,0,0,''] 
newarray=[] 
for course,courseplus1 in zip(classarray,classarray[1:]): 
    if (course[0]==courseplus1[0] and course[1]==courseplus1[1]): 
     itemx[0]=course[0] 
     itemx[1]=course[1] 
     itemx[2]=course[2] 
     for number in range(3,16): 
      itemx[number]=itemx[number]+(int(course[number])+int(courseplus1[number])) 
     itemx[16]=course[16] 
    else: 
     newarray.append(itemx) 
     print(itemx) 
     itemx[0]=courseplus1[0] 
     itemx[1]=courseplus1[1] 
     itemx[2]=courseplus1[2] 
     for number in range(3,16): 
      itemx[number]=int(courseplus1[number]) 

for item in newarray: 
    print(item) 

ただし、出力は次のとおりです。

['AAS', '365', 'Asian American Media and Film', '7', '19', '6', '4', '6', '1', '6', '3', '3', '0', '0', '1', '2', 'S-16'] 

5回。 私はその理由があり、スタックオーバーフローを通して見ることによって理解するものから:

newarray.append(itemx) 

リストにitemxを追加し、 itemxは、最終的にAAS 365の情報が入っている1つの単なるメモリ位置です。だから、新しい配列は、itemxのリストとして、そこにitemxの束を持っています。

私の質問は、この問題にどのように対処するか軽減するかです。 classarrayを作成するために、私はitemxをforループの中に宣言していた以外は同じことをしていました。これはitemxが新しい場所の新しい変数であることを理解しています。

+0

可能な複製[リストのクローンを作成またはコピーする方法?](http://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list) –

+0

をアサインするときループ内の 'itemx'には、ループの各反復に割り当てられた新しい参照を取得する*同じ変数*があります。用語ノート:Pythonには変数宣言はありません。 –

答えて

0
>>> from copy import copy, deepcopy 
help(copy) 
help(deepcopy) 

>>> a = [1] 
>>> b = copy(a) 
>>> b.append(1) 
>>> b 
[1, 1] 
>>> a 
[1] 
+0

または単に 'list(a)' –

+0

です。それは単に 'copy'と' deepcopy'の両方とも、他の種類のオブジェクトに対しても機能します。 – abcdn

0

経験豊富な友人と相談したところ、問題を解決できました。私がする必要があるのは、itemxをnewarrayに追加した後、else文にitemXを再宣言することだけです。これは、メモリ内の新しい場所を指しています(私は思います)!

else: 
    newarray.append(itemx) 
    itemx = ['', '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ''] 
    itemx[0]=courseplus1[0] 
    itemx[1]=courseplus1[1] 
    itemx[2]=courseplus1[2] 
    for number in range(3,16): 
     itemx[number]=int(courseplus1[number]) 
関連する問題