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
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:
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.