2017-11-20 1 views
1

Pythonのリストのリストに関してかなりの質問がありましたが、まだ私が直面している問題を解決することはできません。Python - リストのリスト(変更可能性)

私は可能な限りコードを単純化しようとしましたが、私が結果として期待していることを説明しようとします。

マイコード:

import copy 

class Location(): 
    def __init__(self): 
     self.a_location_variable = 'a string' 
     self.a_location_list = [] 

    def parse_row(self, sline): 
     self.a_location_variable = sline 

    def add_drop(self, drop): 
     self.a_location_list.append(copy.copy(drop)) 

class Drop(): 
    def __init__(self): 
     self.a_drop_variable = 'also a string' 

    def parse_drop(self, sline): 
     self.a_drop_variable = sline 

file = open('example.txt', 'r') 
lines = file.read().split('\n') 

loc = Location() 
loc_list = [] 
drop = Drop() 

all_drops = [] 

for i in range(40, len(lines)): 
    if lines[i][:4] == '5280': 
     loc.parse_row(lines[i]) 
     loc_list.append(copy.copy(loc)) 
    elif lines[i][:4] == '5301': 
     continue 
    elif lines[i][:4] == '5302': 
     continue 
    elif lines[i][:4] == '5303': 
     continue 
    else: 
     drop.parse_drop(lines[i]) 
     loc_list[-1].add_drop(drop) 

EXAMPLE.TXTの含有量は、行41から開始し、次いで、40ヘッダ行の存在:

5280,0,  0,+52.1216717,+004.3834450, 91.7, 4, 10, 100, 0.9 
5301,2,1,4,2, 24800,1,1,"R  ",2017,06,22,02,17 
5302,0,0,A,p,0,1,0,0, 
5303,0, 18.0, 22.5, 23.7 
    1, 0686, 222.0, 187.0, 170.0, 148.0, 133.0, 99.0, 75.0, 58.0, 44.0, 27.300 
    2, 0680, 219.0, 186.0, 169.0, 147.0, 133.0, 98.0, 74.0, 58.0, 43.0, 27.420 
    3, 0680, 218.0, 185.0, 168.0, 146.0, 132.0, 98.0, 74.0, 58.0, 42.0, 27.410 
    4, 0678, 216.0, 183.0, 167.0, 145.0, 131.0, 98.0, 73.0, 58.0, 42.0, 27.460 
5280,0,  0,+52.1217967,+004.3834800, 91.7, 4, 10, 100, 0.9 
5301,2,1,4,2, 24775,1,1,"M  ",2017,06,22,02,18 
5302,0,0,A,p,0,1,0,0, 
5303,0, 18.0, 22.8, 23.6 
    1, 0699, 203.0, 157.0, 134.0, 108.0, 95.0, 70.0, 54.0, 45.0, 34.0, 27.190 
    2, 0704, 204.0, 157.0, 135.0, 109.0, 96.0, 71.0, 55.0, 45.0, 35.0, 27.300 
    3, 0699, 203.0, 157.0, 135.0, 109.0, 96.0, 71.0, 55.0, 45.0, 35.0, 27.200 
    4, 0702, 202.0, 156.0, 134.0, 108.0, 96.0, 70.0, 54.0, 45.0, 35.0, 27.480 
5280,0,  0,+52.1217967,+004.3834800, 91.7, 4, 10, 100, 0.9 
5301,2,1,4,2, 24750,1,1,"R  ",2017,06,22,02,19 
5302,0,0,A,p,0,1,0,0, 
5303,0, 18.0, 22.8, 23.5 
    1, 0688, 226.0, 177.0, 155.0, 130.0, 115.0, 84.0, 63.0, 51.0, 38.0, 27.430 
    2, 0692, 224.0, 175.0, 154.0, 129.0, 115.0, 84.0, 63.0, 51.0, 39.0, 27.420 
    3, 0689, 223.0, 175.0, 154.0, 129.0, 115.0, 84.0, 63.0, 51.0, 39.0, 27.530 
    4, 0690, 223.0, 175.0, 154.0, 129.0, 116.0, 84.0, 63.0, 51.0, 38.0, 27.510 
5280,0,  0,+52.1219608,+004.3839767, 91.7, 4, 10, 100, 0.9 
5301,2,1,4,2, 24724,1,1,"M  ",2017,06,22,02,20 
5302,0,0,A,p,0,1,0,0, 
5303,0, 18.0, 23.0, 23.6 
    1, 0700, 287.0, 208.0, 169.0, 130.0, 110.0, 75.0, 55.0, 44.0, 35.0, 27.350 
    2, 0700, 280.0, 203.0, 166.0, 128.0, 108.0, 74.0, 53.0, 42.0, 32.0, 27.280 
    3, 0697, 280.0, 204.0, 167.0, 130.0, 110.0, 76.0, 55.0, 44.0, 35.0, 27.410 
    4, 0698, 279.0, 203.0, 166.0, 129.0, 109.0, 75.0, 55.0, 44.0, 34.0, 27.340 

たびにコードが5280で始まる行を検索し新しい場所に到達します。したがって、私が結果として期待するものはloc_listであり、4つのアイテム(クラスLocation())を含んでいます。各場所には、Drop()クラスの対応する4行からの情報を含む 'a_location_list'が含まれています。

これはうまくいきません。「loc_list」の各場所には同じ「a_location_list」が含まれています。「削除」情報を持つ16行すべての情報が含まれています'1'、 '' 2 'などで始まる)を、その場所に属する4つの代わりに使用できます。

私はこの問題に指を置くことができないので、これで私を助けることができる人は誰ですか?

可能な限り簡素化しようとしました。

答えて

1

私は同様の問題で他の人の検索と読書を続けましたが、結局解決策を見つけました。

問題は、私が 'a_location_list'のコピーを作成しなかったことでした。クラス場所に

()私はそれになりたいと思ったように、このコードを作っ

def add_drop(self, drop): 
    self.a_location_list = self.a_location_list[:] 
    self.a_location_list.append(copy.copy(drop)) 

def add_drop(self, drop): 
    self.a_location_list.append(copy.copy(drop)) 

修飾。私を助けようとした人のために:どうもありがとう!私はここに私自身の解決策を掲示することによって、他の人もそれによって助けられることを願っています。

関連する問題