2009-07-06 15 views
1
gemeinsamen Wert haben

I Datenzeilen haben, bestehend aus 4 FeldernPython alle Zeilen entfernen, die in den Feldern

aaaa bbb1 cccc dddd 
aaaa bbb2 cccc dddd 
aaaa bbb3 cccc eeee 
aaaa bbb4 cccc ffff 
aaaa bbb5 cccc gggg 
aaaa bbb6 cccc dddd  

Bitte Geduld mit mir.

Das erste und dritte Feld ist immer gleich - aber ich brauche sie nicht, das 4. Feld kann gleich oder verschieden sein. Die Sache ist, ich möchte nur 2. und 4. Felder von Linien, die nicht das gemeinsame Feld teilen. Zum Beispiel, wie dies aus den obigen Daten

bbb3 eeee 
bbb4 ffff  
bbb5 gggg  

Jetzt meine ich nicht Deduplizierung wie in einem der Einträge verlassen würde. Wenn die vierte Feld Aktien ein Wert mit einer anderen Linie, ich will keine Linie welches jemals diesen Wert hatte.

die geringste Entschuldigung noch einmal für die Frage, was wahrscheinlich einfach ist.

Antwort

6

Hier gehen Sie:

from collections import defaultdict 

LINES = """\ 
aaaa bbb1 cccc dddd 
aaaa bbb2 cccc dddd 
aaaa bbb3 cccc eeee 
aaaa bbb4 cccc ffff 
aaaa bbb5 cccc gggg 
aaaa bbb6 cccc dddd""".split('\n') 

# Count how many lines each unique value of the fourth field appears in. 
d_counts = defaultdict(int) 
for line in LINES: 
    a, b, c, d = line.split() 
    d_counts[d] += 1 

# Print only those lines with a unique value for the fourth field. 
for line in LINES: 
    a, b, c, d = line.split() 
    if d_counts[d] == 1: 
     print b, d 

# Prints 
# bbb3 eeee 
# bbb4 ffff 
# bbb5 gggg 
+0

Das über perfekt ist. Danke vielmals. Ich muss es jetzt in mein Skript einbinden, ich übergebe eine Datei und mache die Ausgabe später im Skript (über ein Wörterbuch) verfügbar. Haben Sie irgendwelche Probleme? –

+0

Die einzige Sache, auf die Sie achten müssen, ist, dass ich zweimal über die Zeilen iteriere - Sie können nicht einfach meine zwei ersetzen "für Zeile in LINES:" Schleifen mit zwei "für Zeile in my_open_file:" Schleifen Die erste Schleife liest die ganze Datei und die zweite hat nichts zu lesen. Speichern Sie die Zeilen entweder in einer Liste für die zweite zu verwendende Schleife oder suchen Sie() vor der zweiten Schleife zum Anfang der Datei. – RichieHindle

0

Für Ihre verstärkte Anforderung, können Sie die Datei zweimal zu lesen vermeiden oder sie in einer Liste speichern:

LINES = """\ 
aaaa bbb1 cccc dddd 
aaaa bbb2 cccc dddd 
aaaa bbb3 cccc eeee 
aaaa bbb4 cccc ffff 
aaaa bbb5 cccc gggg 
aaaa bbb6 cccc dddd""".split('\n') 

import collections 
adict = collections.defaultdict(list) 
for line in LINES: # or file ... 
    a, b, c, d = line.split() 
    adict[d].append(b) 

map_b_to_d = dict((blist[0], d) for d, blist in adict.items() if len(blist) == 1) 
print(map_b_to_d) 

# alternative; saves some memory 

xdict = {} 
duplicated = object() 
for line in LINES: # or file ... 
    a, b, c, d = line.split() 
    xdict[d] = duplicated if d in xdict else b 

map_b_to_d2 = dict((b, d) for d, b in xdict.items() if b is not duplicated) 
print(map_b_to_d2) 
Verwandte Themen