2017-12-22 3 views
-2

Ich versuche, Linienmittelwerte aus einer .csv Datei zu berechnen und eine Liste der Durchschnitte jeder Zeile zurückgeben. Derzeit kann ichSo entfernen Sie Apostrophe aus Listen in Listen

in_ = [['1,2'], ['1,1,1,1'], ['-1,0,1'], ['42,17']] 

bekommen, aber ich brauche die Apostrophe zu entfernen, da die einzelnen Listen mitteln! Ich habe versucht, int() zu verwenden, aber hatte kein Glück.

Meine gewünschte Ausgabe

out = [[1, 2], [1, 1, 1, 1], [-1, 0, 1], [42, 17]] 

mein aktueller Code ist:

def line_averages(filename): 
    """takes a file and returns the average values of each line in a 
    .csv file""" 
    f = open(filename, 'r') 
    lines = f.readlines() 
    #print(lines) 
    f.close() 
    words = [] 
    for line in lines: 
     words.append(line.split()) 
    for i in words: 
     words.replace("'", "") 
    return words 
+1

Thats, weil gesamtes Listenelement eine Zeichenkette ist. Versuchen Sie, sie zuerst auf '' '' zu trennen und dann in int zu konvertieren. –

+2

Mit * "Apostrophe entfernen" * Meinst du "Zeichenfolgen in ganze Zahlen konvertieren"? Das könnte einfacher zu suchen sein. – jonrsharpe

+0

Könnten Sie bitte den Code anzeigen, den Sie aus der CSV-Datei lesen? Es kann einen Weg geben, dies automatisch ohne einen mühsamen Nachverarbeitungsschritt zu tun. – Kevin

Antwort

3

Sie sind hier, um das CSV-Leser Rad neu zu erfinden. Verwenden Sie stattdessen die csv module, um die Aufteilung für Sie zu behandeln; wir dann müssen nur die String-Spalten auf ganze Zahlen konvertieren:

def line_averages(filename): 
    """takes a file and returns the average values of each line in a 
    .csv file""" 
    with open(filename, 'r', newline='') as f: 
     reader = csv.reader(f) 
     for row in reader: 
      yield [int(c) for c in row] 

Dieser einen Generator erzeugt, und Iteration gibt Ihnen Reihen mit ganzen Zahlen:

for row in line_averages(some_file_name): 
    # do something with each row 

Sie auch eine Liste der Listen zurückgeben kann:

Ihr Versuch teilt sich auf Whitespace, und nicht auf Kommas. Sie müßten auf ',' ausdrücklich geteilt, und Ihre Spalten auf ganze Zahlen konvertieren:

def line_averages(filename): 
    """takes a file and returns the average values of each line in a 
    .csv file""" 
    with open(filename, 'r') as f: 
     return [[int(c) for c in line.split(',')] for line in f] 

I verwendet nested list comprehensions hier eine Liste von Listen zu erzeugen, wobei jede Zeile aus der Datei in eine Liste von ganzen Zahlen zu verwandeln.

Ich verwendete auch die Datei als context manager in a with statement; Dadurch wird sichergestellt, dass die Datei geschlossen wird, unabhängig davon, was im verwalteten Block geschieht. Sie müssen es nicht manuell schließen.

Ich verwendete auch die Datei als Iterator; Jedes Mal wenn Sie iterieren (wie die for Schleife würde), erhalten Sie die nächste Zeile in der Datei. Es müssen nicht alle Zeilen mit file.readlines() gelesen werden.

+0

Danke für die Antwort, bei der Verwendung dieses genauen Codes gibt es aus:

+0

@SebTerry: ja, Sie haben einen Iterator. Sie können das jetzt in einer 'for'-Schleife verwenden. –

Verwandte Themen