Seite 1 von 1

Dictionary problem

Verfasst: Mittwoch 27. Januar 2010, 08:28
von mit
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

Verfasst: Mittwoch 27. Januar 2010, 08:37
von achilles_69
Bist Du sicher, dass jeder Key nur einmal in der Datei vorkommt?

Verfasst: Mittwoch 27. Januar 2010, 08:50
von 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('#'))

Verfasst: Mittwoch 27. Januar 2010, 09:06
von mit
@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.

Verfasst: Mittwoch 27. Januar 2010, 09:18
von Zap
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]

Verfasst: Mittwoch 27. Januar 2010, 09:19
von jens
sowas in der Art einbauen:

Code: Alles auswählen

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

Verfasst: Mittwoch 27. Januar 2010, 10:28
von mit
@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?

Verfasst: Mittwoch 27. Januar 2010, 10:38
von Zap
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?!

Verfasst: Mittwoch 27. Januar 2010, 10:45
von mit
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.

Verfasst: Mittwoch 27. Januar 2010, 12:27
von mit
Ich habe es wie folgt gelöst:

Code: Alles auswählen

for v in d[key]:
        print v + ", " + key+ ", " + string
Vielen Dank an alle.

Verfasst: Mittwoch 27. Januar 2010, 15:35
von jbs

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

Verfasst: Freitag 29. Januar 2010, 01:34
von mit
Danke netter trick.