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:

Code: Alles auswählen

{test1: 'server', test2: 'response', test3: '3'}
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:

Code: Alles auswählen

filter(bool, my_string.split('\\'))
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:

Code: Alles auswählen

filter(bool, my_string.split('\\'))
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.