2017-07-08 3 views
-1

Ich benutze Python 2.7 und Python dict s.Hinzufügen von durch Komma getrennten Elementen in separaten Zeilen zu einem Dict in Python

Ich habe meine Ausgabe wie folgt:

goods: apples, oranges 
trunk_names: trunk01, trunk02, trunk03,trunk04, 
      trunk05,trunk06, trunk07,trunk08, 
      trunk09,trunk10, trunk11,trunk12 

Mein Code:

d = {} 
    for line in output.split("\n"): 
     if ":" not in line: 
      continue 
     key, value = line.strip().split(":", 1) 
     d[key] = value 

Erwartete Schlüssel und seinen Wert:

trunk_names: trunk01, trunk02, trunk03,trunk04,trunk05,trunk06, trunk07,trunk08,trunk09,trunk10, trunk11,trunk12 

tatsächliche Schlüssel und Werte ausgegeben:

trunk_names: trunk01, trunk02, trunk03,trunk04, 
+0

Wenn Ihre Zeile keinen Doppelpunkt hat, überspringen Sie sie einfach. Warum? –

+0

Da Sie die Datei Zeile für Zeile analysieren, fehlen die zweiten zwei Zeilen der Werte unter 'trunk_names'. Diese Zeilen haben keinen Doppelpunkt und Ihr Code tut nichts, um sie zu analysieren. –

Antwort

0

In Ihrem bestehenden Code überspringen Sie Zeilen, die keinen Doppelpunkt enthalten, sodass Sie mehr als die Hälfte Ihrer Daten löschen.

Sie können ein Wörterbuch der <key : list> Paare verwenden, um jedes einzelne Element in einer Liste zu speichern, die durch den Schlüssel indiziert wird.

from collections import defaultdict 
import pprint 

output = '''goods: apples, oranges 
trunk_names: trunk01, trunk02, trunk03,trunk04, 
      trunk05,trunk06, trunk07,trunk08, 
      trunk09,trunk10, trunk11,trunk12''' 

d = defaultdict(list) 
for line in output.split("\n"): 
    if ":" in line: 
     key, line = line.split(':') 

    items = line.strip().split(',') 
    d[key].extend([i.strip() for i in items if i]) # check to make sure we don't add '' items to the list 

pprint.pprint(d) 

Hier verwende ich die collections.defaultdict so brauchen Sie nicht explizit die Tasteneingabe zu erstellen, bevor Elemente ihm hinzufügen.

Laufen ergibt dies:

{'goods': ['apples', ' oranges'], 
'trunk_names': ['trunk01', 
       'trunk02', 
       'trunk03', 
       'trunk04', 
       'trunk05', 
       'trunk06', 
       'trunk07', 
       'trunk08', 
       'trunk09', 
       'trunk10', 
       'trunk11', 
       'trunk12']} 
+0

Benötigen Sie 'Schlüssel', sehe ich nicht, dass sie jemals benutzt werden? – AChampion

+0

@AChampion Du hast Recht. 'Schlüssel' können gelöscht werden. –

1
from collections import defaultdict 

output = ''' 
goods: apples, oranges 
trunk_names: trunk01, trunk02, trunk03,trunk04, 
      trunk05,trunk06, trunk07,trunk08, 
      trunk09,trunk10, trunk11,trunk12 
''' 

d = defaultdict(list) 

current_key = None 

for line in output.split('\n')[1:]: 
    if ":" in line: 
     current_key = line.split(':')[0].strip() 
     values = line.split(':')[1] 
    else: 
     values = line 

    d[current_key] += [ 
     value.strip() 
     for value in values.split(',') 
     if value.strip() 
    ] 


print(d) 

gibt:

defaultdict(<type 'list'>, {'trunk_names': ['trunk01', 'trunk02', 'trunk03', 'trunk04', 'trunk05', 'trunk06', 'trunk07', 'trunk08', 'trunk09', 'trunk10', 'trunk11', 'trunk12'], 'goods': ['apples', 'oranges']}) 
0

Wie stabil Ihre Struktur ist, wenn es sehr stabil ist und die Datenqualität hoch ist, dann können Sie Ihre durch Testen vereinfachen wenn die line.endswith(','):

In []: 
d = {} 
f = iter(output.split('\n')) 
for line in f: 
    key, line = map(str.strip, line.split(':', 1)) 
    while line.endswith(','): 
     line += next(f) 
    d[key] = [i.strip() for i in line.split(',')] 

pprint.pprint(d) 

Out[]: 
{'goods': ['apples', 'oranges'], 
'trunk_names': ['trunk01', 
       'trunk02', 
       'trunk03', 
       'trunk04', 
       'trunk05', 
       'trunk06', 
       'trunk07', 
       'trunk08', 
       'trunk09', 
       'trunk10', 
       'trunk11', 
       'trunk12']} 
Verwandte Themen