Seite 1 von 1
String to dict
Verfasst: Freitag 2. April 2010, 17:11
von Ben_Gunn
Hallo an alle!
Ich bin gerade dabei einwenig Python zu lernen und stehe vor einem kleinen Problem:
Ich versuche seit geraumer Zeit einen String in ein Dict Objekt zu bekommen.
Ich bin bereits im Internet auf Lösungen gestoßen welche allerdings davon ausgehen,
dass 2 Delimiter im String existieren.
Bei mir sieht es folgendermaßen aus:
Code: Alles auswählen
my_string = "\\test1\\server\\test2\\response\\test3\\3"
In ein dict umgewandelt sollte soetwas rauskommen:
Ungerade Indexe sind also die Schlüssel, gerade sind die Werte.
Wie könnte man das anstellen?
Vielen Dank & LG
Verfasst: Freitag 2. April 2010, 17:18
von lunar
Code: Alles auswählen
>>> my_string = "\\test1\\server\\test2\\response\\test3\\3"
>>> parts = my_string.split('\\')
>>> dict(zip(parts[1::2], parts[2::2]))
{'test1': 'server', 'test2': 'response', 'test3': '3'}
Geht möglicherweise noch eleganter.
Verfasst: Freitag 2. April 2010, 17:21
von Ben_Gunn
Super. Danke sehr.
So einfach geht das

Verfasst: Freitag 2. April 2010, 17:32
von derdon
lunar: meine Version sieht anders aus, aber dafür noch uneleganter:
Code: Alles auswählen
>>> my_string = "\\test1\\server\\test2\\response\\test3\\3"
>>> splitted_string = filter(bool, my_string.split('\\'))
>>> dict(zip(splitted_string, splitted_string[1:])[::2])
{'test1': 'server', 'test3': '3', 'test2': 'response'}
Verfasst: Freitag 2. April 2010, 18:18
von theliquidwave
Was bringt das @derdon:
Also der filter, was soll der bezwecken?
Gruß
Verfasst: Freitag 2. April 2010, 18:27
von lunar
@Chrisber: Probiers aus

Verfasst: Freitag 2. April 2010, 18:28
von ms4py
Chrisber hat geschrieben:Was bringt das @derdon:
Also der filter, was soll der bezwecken?
Gruß
Code: Alles auswählen
>>> splitted_string
['test1', 'server', 'test2', 'response', 'test3', '3']
>>> my_string.split('\\')
['', 'test1', 'server', 'test2', 'response', 'test3', '3']
>>>
Verfasst: Freitag 2. April 2010, 22:37
von fabi1511
ich hätts jetzt ganz spontan über LC versucht:
Code: Alles auswählen
my_list=my_string.split("\\")
my_dict=dict([(my_list[2*i],my_list[2*i+1]) for i in xrange(len(my_list)//2)])
ein filter könnte man da natürlich auch einbauen...
Verfasst: Samstag 3. April 2010, 06:57
von nemomuk
das hier wäre vllt. noch ganz nett zu lesen...
Code: Alles auswählen
parts = "\\test1\\server\\test2\\response\\test3\\3".split("\\")
dict((parts[i], parts[i+1]) for i in xrange(1, len(parts), 2))
Verfasst: Samstag 3. April 2010, 07:26
von snafu
Code: Alles auswählen
>>> my_string = "\\test1\\server\\test2\\response\\test3\\3"
>>> elems = my_string.lstrip('\\').split('\\')
>>> dict(zip(*[iter(elems)] * 2))
{'test1': 'server', 'test3': '3', 'test2': 'response'}
Abgeguckt übrigens von der Funktion `grouper()` bei den `itertools`-Beispielen. Für solche Sachen ist die Seite oft Gold wert.

Verfasst: Samstag 3. April 2010, 12:00
von fabi1511
@ahojnnes
stimmt so wäre das eleganter... dass ich da nicht selbst drauf gekommen bin
Verfasst: Samstag 3. April 2010, 12:50
von DasIch
Elegant ist was man lesen kann... Wenn du mehr als 5 Minuten über ein solch triviales Problem nachdenkst steht die Chance gut dass du es beim lesen auch tun musst.