2016-04-27 4 views
0

ich aus einer txt-Datei lese: (es ist genau formatiert wie unten)Python: Lesen von zwei getrennten Linien, die Schaffung von zwei Listen

(+1 +2 +3 +4)

(-4 -9) (- 3 -6 -7)

My gewünschte Ausgabe ist, zwei (integer) haben listet

sowohl vor dem \ n und nach.

Beispiel:

BEFORE_LIST = [1,2,3,4] 

AFTER_LIST = [[-4,-9] , [-3, -6, -7]] 

Ich kann nicht die richtige Kombination von Spalten und Streifen herauszufinden, damit dies geschieht.

Jede Hilfe, ich bin sehr dankbar.

+0

Kann Ihre Datei verschachtelte Listen enthalten? – user312016

+0

Es tut mir leid, aber ich bin Anfänger mit Python, ich bin nicht vertraut mit verschachtelten Listen. aber es gibt keine Regel, die besagt, dass sie nicht verwendet werden kann. Bitte erkläre, ob du Zeit hast. – Qbert

+0

Ist '+1 +2 +3 + 4' gültige Eingabe? Wenn ja, was ist die erwartete Ausgabe? – niemmi

Antwort

1

Wird es tun?

import re 
from ast import literal_eval 
with open('test','r') as f: 
    for line in f: 
     line = line.replace(' ',',').replace('+','') 
     my_list = re.findall(r'\(.+?\)',line) 
     result = [list(literal_eval(i)) for i in my_list] 
     if len(result)==1: 
      result = [i for term in result for i in term ] 

     print result 

Ausgang:

def isInt(s): 
    try: 
     int(s) 
     return True 
    except: 
     return False 

oder eine aufwendigere Lösung, die die Ausnahme vermeidet:

[1, 2, 3, 4] 
[[-4, -9], [-3, -6, -7]] 
2
listOfValues = (x.split(' ')for x in (val.replace(')','') for val in input().split('('))) 
listOfIntegers = list(filter(None, [[int(value) for value in values if isInt(value)]for values in listOfValues])) 

print(listOfIntegers) 

Das ist isInt Methode kann definiert werden als

def isInt(s): 
    return s.replace('+').replace('-').isdecimal() // doesn't cover all cases 

Dies prüft nicht auf ungültiges Eingabeformat (z. B. nicht übereinstimmende Paranthese).

+0

Anstatt Ihrer benutzerdefinierten 'isInt'-Funktion, verwenden Sie einfach' str.isdecimal() '? –

+0

@ByteCommander bearbeitet. Obwohl isDecimal sich nicht um das vorangehende +/- in der Zeichenkette kümmert, musste ich einen Sonderfall dafür machen. Ich mochte meine IsInt-Methode irgendwie mehr, obwohl es Ausnahmen auf glücklichen Wegen gab, die mich irgendwie vor Perfektion warnten. Offensichtlich können sowohl Custom isInt als auch isDecimal durch die Verwendung von Regex-Magie vermieden werden. – bashrc

+0

Rechts. Sie könnten Ihre alte Version als Alternative hinterlassen, zeigen Sie beide in Ihrer Antwort.Mein Kommentar war nur ein Vorschlag, der Try-Catch-Ansatz war auch in Ordnung. Aber es wäre schön, wenn Sie Ihren Code so formatieren könnten, dass wir nicht die horizontale Bildlaufleiste verwenden müssen ... Danke. –