2016-07-15 4 views
0

Ich benutze Python 2.7, nur mit Standard-Modulen.Alle Listenelemente ändern sich zu angehängten Element, in Python

Ich habe eine riesige Datendatei, die eine Reihe von Informationen über Autoereignisse enthält. Ich versuche, die Daten über einen einzelnen Autoereignistyp (z. B. Beschleunigung) zu kopieren und in eine separate Datei zu schreiben. Mein aktueller Ansatz speichert die Daten in einer Tabelle - ich benutzte Listen in Listen - bevor ich sie in die separate Datei schreibe (siehe Beispieltabelle unten).

Event Type | Data Location Start | Data Location End 
-------------------------------------------- 
Accelerate | 99     | 181 
Break  | 182     | 263 
Horn  | 264     | 351 
Accelerate | 352     | 434 
...and so on 

The table above in Python would be: 

event_list = [['Accelerate', 99, 181], 
       ['Break', 182, 263], 
       ['Horn', 264, 351], 
       ['Accelerate', 352, 434]] 

Ausgabe: Jedes Mal, wenn ich eine Zeile anhängen, werden alle anderen Zeilen dieser beigefügten Zeile ändern. Ich habe meinen Code und die Konsolenausgabe unten zur Verfügung gestellt.

#!/usr/bin/python  
""" File Description """ 

import os 

def main(): 
    """ Organize Car Data Into New File """ 

    event_list = []    # This is the entire table 
    first_event = True   # This is a flag 
    single_event = [-1, -1, -1] # This is a single row in the table 
           # [Event Name, Code Line Start, Code Line End] 

    with open('C:/car_event_data.dat', 'rb') as f: 
     line = '-1' 

     while line != '':       # If line = '' then it is EOF 
      line = f.readline() 
      if line[0:6] == 'Event:': 
       if first_event == False:    
        single_event[2] = f.tell() - 1 # Code Line End 
        event_list.append(single_event) # Completed row 
        print(event_list) 
       end = line.find('\x03', 6)   # Find the end location of Event Type 
       single_event[0] = line[6:end]  # Event Type 
       single_event[1] = f.tell()   # Code Line Start 
       first_event = False 

     f.seek(0, os.SEEK_END)      # Put pointer at EOF 
     single_event[2] = f.tell() 
     event_list.append(single_event) 

if __name__ == '__main__': 
    main() 

Der obige Code erzeugt die folgende Ausgabe:

[['Accelerate', 99, 181]] 
[['Break', 182, 263], ['Break', 182, 263]] 
[['Horn', 264, 351], ['Horn', 264, 351], ['Horn', 264, 351]] 
... and so on 

Antwort

1

Listenobjekte sind durch Bezugnahme in Python geben. Der Grund dafür, dass die zuvor angehängten Elemente zur aktuellen Zeile mutieren, liegt darin, dass sie alle auf dieselbe Liste, single_event, verweisen.

Eine einfache

single_event = list(range(3)) 

nach jedem Anfügevorgang Ihr Problem lösen sollte.

+0

Vielen Dank. Dies behebt das Problem –

+0

Gern geschehen. Bitte akzeptieren Sie die Antwort (das grüne Häkchen), hilft auch mit dem Rep :) –

Verwandte Themen