Zeilenumbruch und/oder Einzelne Strings in List zus.fügen!

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
BlackJack

@Civex: ``liste.pop(index)`` *entfernt* das angegebene Element aus der Liste, das heisst die Liste wird verändert; alle nachfolgenden Elemente werden eins nach vorne gerückt. Warum machst Du das, statt einfach nur auf das erste Element zuzugreifen ohne die Liste zu verändern. Dass Du grundsätzlich weisst wie das geht zeigt Dein Quelltext ja auch: mit ``liste[index]`.

Andererseits sind solche Indexe immer ein bisschen unschön, weil man da "magische" Zahlen verwendet. Der Name `tag` für ein Tag ist jedenfalls verständlicher als eine 1. Deshalb habe ich im ersten Verarbeitungsschritt der Zeile die drei Bestandteile direkt an Namen gebunden:

Code: Alles auswählen

    token, tag, dummy = line.split('\t')
Und `token` und `tag` sind IMHO im weiteren Programmverlauf verständlicher als `list_single_line[0]` und `list_single_line[1]` bzw. `list_single_line.pop(0)`. Wobei nach Letzterem `list_single_line[1]` plötzlich eine andere Bedeutung bekommt. Ab da ist das nämlich nicht mehr das Tag sondern das Lemma.

Statt `dummy` hätte ich auch den Namen `lemma` nehmen können, aber ich kennzeichne auf diese Weise gerne Namen, die nicht verwendet werden.

Als unleserlicher Einzeiler sähe das übrigens so aus:

Code: Alles auswählen

print''.join((lambda a,b,_:a+'/'+b.split('.')[0]+' ')(*s.split('\t'))if s else'\n'for s in korpus.splitlines())
:-)

Edit: @numerix: Ätsch, meins ist ein Zeichen kürzer. :-P
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

BlackJack hat geschrieben:Edit: @numerix: Ätsch, meins ist ein Zeichen kürzer. :-P
Hab ich extra lang gemacht - ich wollte dich doch auch mal gewinnen lassen ... :wink:
CiveX
User
Beiträge: 34
Registriert: Samstag 23. Mai 2009, 11:48

Hast ja recht, ich hab es soweit vereinfacht, wie es für mich zumindest nachvollziehbar und verständlich ist:

Code: Alles auswählen

# Für jede Zeile im Korpus
for line in korpus.splitlines():
    linelenght = len(line) #Zeilenlänge je Zeile ermitteln
    
    # Ist die Zeilenlänge = 0, also leer, dann Zeilenumbruch
    if linelenght == 0:
        print 
    
    # Ist sie nicht leer, dann
    else:
        # Jede Zeile wird aufgeteilt an den Tabstobs und an Variablen Token, Tag und Lemma übergeben
        token, tag, lemma = line.split('\t')

        # Das 1. Tag vor dem 1. Punkt wird an an neue Variable übergeben
        tag_neu = tag.split(".")[0]    

        # Zusammenfügen von Token + Schrägstrich +  Tag
        tokentag = token + "/" + tag_new

        # finale Ausgabe in geforderter Form
        print tokentag,
Ist doch nun viel besser. Danke euch allen :)!

Was ich allerdings nicht verstehe ist, warum man auch:

Code: Alles auswählen

for line in korpus.splitlines():
	if line:
		blablub
	
	else:
		print
Schreiben kann und es genauso geht wie mit dem Ermitteln der Zeilenlänge. Ich mein wo frage ich denn da ob Zeile leer ist oder net? "if line:" sagt mir überhaupt nix.
Zuletzt geändert von CiveX am Samstag 23. Mai 2009, 19:00, insgesamt 2-mal geändert.
BlackJack

@numerix: Na dann: 6 Zeichen kürzer als Deins:

Code: Alles auswählen

print''.join((lambda a,b,_:a+'/'+b.split('.')[0]+' ')(*s.split())if s else'\n'for s in korpus.split('\n'))
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

civex, ein leerer string ist false, alle anderen true.
http://www.kinderpornos.info
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

print''.join(s and(lambda a,b,_:a+'/'+b.split('.')[0]+' ')(*s.split())or'\n'for s in korpus.split('\n'))
Das Leben ist wie ein Tennisball.
Antworten