2017-01-27 5 views
0

Ich habe einen 2-Spalten-Tab-getrennten Eingang, den ich ein Wörterbuch in python auffüllen möchte. Die erste Spalte wird dem Schlüssel zugeordnet (es gibt Duplikate) und die zweite Spalte wird dem Wert zugeordnet.Listenwert in Python-Wörterbuch mit relevantem Schlüssel verknüpfen

Probeneingang:

cat tail 
cat whisker 
cat meow 
cat black 
dog tail 
dog paw 
dog bark 
bird beak 

ich den folgenden Code geschrieben haben, die eine (wenn auch falsch) Ausgang erzeugt, das Wörterbuch-Format enthält, die ich suche, die allen ein Schlüssel aus col1 zuordnet seiner Werte in col2.

Der Code, den ich verwendet habe, ist:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

keys = [] 
values = [] 

with open('animal-trial', "rU") as f: 
    for line in f: 
     line = line.split() 
     keys.append(line[0]) 
     values.append(line[1]) 
    d = {} 
    for k,v in zip(keys, values): 
     d.setdefault(k, []).append(v) 
    print d 

ich [HERE] andere Referenzen ausgesehen haben auf, [HERE] und [HERE] jedoch alle Vorschläge, auch mit defaultdicts mich bringen, um die gleiche Leistung, eher als die gewünschte Ausgabe.

Die tatsächliche Ausgabe lautet:

{'cat': ['tail']} 
{'cat': ['tail', 'whisker']} 
{'cat': ['tail', 'whisker', 'meow']} 
{'cat': ['tail', 'whisker', 'meow', 'black']} 
{'dog': ['tail'], 'cat': ['tail', 'whisker', 'meow', 'black']} 
{'dog': ['tail', 'paw'], 'cat': ['tail', 'whisker', 'meow', 'black']} 
{'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']} 
{'bird': ['beak'], 'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']} 

Die gewünschte Ausgang

ist
{'bird': ['beak'], 'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']} 

Kann zeigen Sie mir jemand, wo ich einen Fehler mache oder eine umfassendere Lösung, so dass Das Endergebnis ist one Wörterbuch?

+2

Sie * bis * haben ein Wörterbuch. Ihr Einzug muss sich von dem, was Sie gepostet haben, unterscheiden. Ihre letzte Druckanweisung befindet sich wahrscheinlich in der for-Schleife. –

+0

@ owwoow14 Das ist richtig, dein Code funktioniert, denke ich. Drücken Sie die Anweisung 'print d' zurück. – MYGz

Antwort

2

Sie können prüfen, ob der Schlüssel vorhanden ist, wenn es vorhanden ist, dann anhängen und wenn es nicht dann ist eine Liste mit einzelnen Element erstellen:

d = {} 
with open('a12', 'r') as f: 
    for line in f: 
     if line.strip(): 
      a = line.split() 
      if a[0] not in d: 
       d[a[0]] = [a[1]] 
      else: 
       d[a[0]].append(a[1]) 
print d 

Ausgang:

{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']} 

Mit Pandas:

import pandas as pd 

df = pd.read_csv('file_name', header=None, sep='\s+') 
print df.groupby(0)[1].apply(list).to_dict() 

Out Put:

+0

Warum nicht ein normales Diktat verwenden? –

+0

@SembeiNorimaki \t OK? – MYGz

1

Ich nehme an, Sie haben eine Eingabedatei namens f_input.txt.

Sie können auch groupby von itertools Modul wie in diesem Beispiel verwenden:

from itertools import groupby 

data = list(k.rstrip().split() for k in open("f_input.txt", 'r')) 
final = {} 
for k, v in groupby(data, lambda x : x[0]): 
    final[k] = list(k[1] for k in list(v)) 

print(final) 

Ausgang:

{'bird': ['beak'], 'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']} 
0

Sie Ihre Eingabe

d = {} 
tab = ['cat tail', 'cat whisker', 'cat meow', 'cat black', 'dog tail', 'dog paw', 'dog bark', 'bird beak'] 
for i in tab: 
    try: 
     d[i.split(" ")[0]] += [i.split(" ")[1]] 
    except KeyError: 
     d[i.split(" ")[0]] = [i.split(" ")[1]] 
auf "\ n" haben aufspalten lässt vermuten

Ausgabe

{'Vogel': ['Schnabel'], 'Hund': ['Schwanz', 'Pfote', 'Rinde'], 'Katze': ['Schwanz', 'Whisker', 'Miau', 'black']}

0

Dies kann mit Standard-defaultdict

-Code gelöst werden:

from collections import defaultdict 

def main(): 
    keys = [] 
    values = [] 

    with open('animal-trial', "rU") as f: 
     for line in f: 
      line = line.split() 
      keys.append(line[0]) 
      values.append(line[1]) 
     d = defaultdict(list) 
     for k,v in zip(keys, values): 
      d[k].append(v) 
     print(dict(d)) 

if __name__ == "__main__": main() 

Ausgang:

{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']} 
Verwandte Themen