2016-11-07 5 views
0

ich eine Textdatei mit dem folgenden haben:Looping durch Datei und versuchen, Gruppenwerte von Tasten

1 cdcdm 
1 dhsajdhsa 
2 ffdm 
2 mdff 
3 ccdfm 
3 cdmfc 
3 fmdcc 

Mein Ziel ist es für die Ausgabe wie folgt aussehen:

1 : cdcdm, dhsajdhsa 
2 : ffdm, mdff 
3 : ccdfm, cdmfc, fmdcc 

Ich schrieb die folgenden Code, aber aus irgendeinem Grund bekomme ich nicht die erwartete Ausgabe.

value_list = '' 
cur_key = None 
key = None 
f = open('example.txt', 'r') 
for line in f.readlines(): 
    try: 
     key, value = line.split() 
     key = key.strip() 
     value = value.strip() 
     if cur_key == key: 
      value_list = value_list + "," + value 
     else: 
      if cur_key: 
       print(cur_key + ":" +value_list) 
       cur_key = key 
       value_list = '' 
      else: 
       cur_key = key 
    except Exception as e: 
     continue 

Ich erhalte die folgende Ausgabe:

1:,dhsajdhsa 
2:,mdff 

Wie kann ich meinen Code ändern, um diese an die Arbeit?

Danke,

Mango

Antwort

2

Ein minimal verändert Implementierung wie diese

with open('example.txt', 'r') as f: 
    cur_key = None 
    value_list = [] 
    for line in f.readlines(): 

     key, value = line.split() 
     value = value.strip() 

     if not cur_key: 
      cur_key = key 

     if cur_key == key:  
      value_list.append(value) 
     else: 
      print(cur_key + ":" + ', '.join(value_list)) 
      cur_key = key 
      value_list = [value] 
    print(cur_key + ":" +', '.join(value_list)) 

Ausgabe aussehen könnte:

1:cdcdm, dhsajdhsa 
2:ffdm, mdff 
3:ccdfm, cdmfc, fmdcc 

Also müssen wir sicherstellen, cur_key hat einen Wert für die erste Iteration. Stellen Sie es also ein, wenn nicht None. Auch wenn wir einen neuen Schlüssel finden, sollten wir value_list nicht zurücksetzen, um leer zu sein. Es sollte auf den Wert eingestellt sein, der in dieser Zeile gelesen wird, so dass das Pfandrecht nicht übersprungen wird. Um auch die letzte Gruppenlinie abzufangen, sollten wir die Werte am Ende noch einmal außerhalb der Schleife drucken.

1

Verwendung itertools.groupby:

import itertools 

with open('example.txt') as f: 
    for key, strings in itertools.groupby(f, lambda s: s.strip()[0]): 
     print('{}: {}'.format(
      key, ', '.join(s.split(None, 1)[1].strip() for s in strings))) 

Hier ist eine Antwort auf Ihren Code basiert:

value_list = [] 
cur_key = None 
f = open('example.txt', 'r') 

for line in f: 
    key, value = line.split() 
    key = key.strip() 
    value = value.strip() 
    if cur_key == key or cur_key is None: 
     value_list.append(value) 
    else: 
     print('{}: {}'.format(cur_key, ','.join(value_list))) 
     value_list = [value] 
    cur_key = key 

if value_list: 
    print('{}: {}'.format(cur_key, ','.join(value_list))) 
+0

Gibt es eine Möglichkeit, dies zu tun, indem Sie meinen vorhandenen Code ändern? Ich tendiere dazu, es auf eine bestimmte Art und Weise zu lösen. – mangodreamz

0

Ich empfehle, dass weg und mit einem collections.defaultdict werfen. Dann können Sie die Werte in eine Liste für den entsprechenden Schlüssel hinzufügen und drucken das fertige Wörterbuch wenn Sie fertig sind:

import collections 

d = collections.defaultdict(list) 

with open('example.txt') as f: 
    for line in f: 
     k,v = line.split() 
     d[k].append(v.strip()) 

for k,v in sorted(d.items()): 
    print('{} : {}'.format(k, ', '.join(v))) 
+0

Ich möchte, dass die Lösung zustandslos ist. Gibt es eine Möglichkeit, es zu lösen, ohne sich an das gesamte Wörterbuch zu erinnern? – mangodreamz

+0

@mangodreamz: Das ist die 'groupby' Antwort. – ShadowRanger

0

Ich glaube auch, es gibt bessere Möglichkeiten, es zu tun, aber wenn Sie wirklich an den Grundlagen bleiben wollen, zumindest Listen verwenden, anstatt Text zu verketten. Hier ist noch eine weitere Version Ihres Codes mit leichten Änderungen:

lists = [] 
cur_key = None 
key = None 
f = open('example.txt', 'r') 
for line in f.readlines(): 
    try: 
     key, value = line.split() 
     key = key.strip() 
     value = value.strip() 
     if cur_key != key: 
      if(cur_key): 
       lists.append(value_list) 
      value_list = [] 
      cur_key = key 
     value_list.append(value) 
    except Exception as e: 
     continue 
lists.append(value_list) 

for i,l in enumerate(lists): 
    print(str(i+1) + ' : ' + ', '.join(l))