Dictionary problem

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.
Antworten
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Hallo,
Ich habe versucht 2882 keys aus einer Datei in Dictionary zu speichern, aber leider erhalte ich nur 2814 keys.

Code: Alles auswählen

  
for line in inputFile.readlines():
    if not line[0] == "#" :
      parts = line.rstrip().split("\t")
      dict[parts[1]] = parts[0]
Hat Dictionary ein limit oder mache ich etwas falsch?

Viele Grüße
achilles_69
User
Beiträge: 21
Registriert: Dienstag 31. März 2009, 14:05
Wohnort: Bielefeld

Bist Du sicher, dass jeder Key nur einmal in der Datei vorkommt?
BlackJack

@mit: Der Aufruf von `readlines()` ist überflüssig. Den Namen `dict` sollte man nicht neu binden, denn dann kann man die gleichnamige Funktion nicht mehr verwenden. Was man in diesem Fall zum Beispiel so machen könnte:

Code: Alles auswählen

a_dict = dict(s.rstrip().split('\t', 1)
              for s in input_file
              if not s.startswith('#'))
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

@achilles_69: Ich bin nicht ganz sicher, dass jeder Key nur einmal in der Datei vorkommt. Könnte man den Code so ändern, dass ich weiss welche Key mehrmals vorkommt oder wenigsten die Anzahl der doppelten Keyes erhalte?

@BlackJack: Ich werde den Namen ändern.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Also ich bin ja ein Fan von der Lösung mit dem defaultdict. (ungetestet)

Code: Alles auswählen

from collections import defaultdict
d = defaultdict(list)
for s in input_file
    if not s.startswith('#'):
        k, v = s.rstrip().split('\t', 1)
        d[k].append(v)

# doppelte ausgeben:
print [(k, v) for k, v in d.items() if len(v) > 1]
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

sowas in der Art einbauen:

Code: Alles auswählen

if key in my_dict:
    print "Key %r schon vorhanden!" % key

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

@Zap: Danke, defaultdict sieht gut aus.

Als nächstes möchte ich aus dem defaultdict die Werte ausgeben, aber leider weiss ich nicht wie man es macht, d.h. ich kann nicht

Code: Alles auswählen

a.write( d[matchString][1])

vewenden, weil ein Key nur ein Wert oder mehre Werte behalten kann?
Zuletzt geändert von mit am Mittwoch 27. Januar 2010, 10:46, insgesamt 2-mal geändert.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Grundlegend kannst du dich ja darauf verlassen das jede Liste mindestens 1 Element hat (also index 0).
Nun musst du aber entscheiden welchen Eintrag du verwenden möchtet wenn ein Key mehrfach vergeben ist.
Dafür muss es ja irgend eine Regel geben, oder?!
Zuletzt geändert von Zap am Donnerstag 28. Januar 2010, 06:23, insgesamt 1-mal geändert.
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

In meinem Fall alle Werte ausgeben, aber in leicht modifizierter weise z.B.

Wert1, Key1, String1
Wert2, Key1, String2
Wert1, Key2, String3
Wert1, Key3, String4

String 1-4 wird gesondert berechnet und musst nur in die write() methode mit eingebunden werden.
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Ich habe es wie folgt gelöst:

Code: Alles auswählen

for v in d[key]:
        print v + ", " + key+ ", " + string
Vielen Dank an alle.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Code: Alles auswählen

In [1]: print 'a' + ", " + 'b' + ", " 'c'
------> print('a' + ", " + 'b' + ", " 'c')
a, b, c

In [2]: print ', '.join(('a','b','c'))
------> print(', '.join(('a','b','c')))
a, b, c
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Danke netter trick.
Antworten