2011-01-07 14 views
9

że posiada ciąg znaków w postaci:tworzenia słownika z ciągiem

s = 'A - 13, B - 14, C - 29, M - 99' 

i tak dalej (długość waha). Jaki jest najłatwiejszy sposób na stworzenie tego słownika?

A: 13, B: 14, C: 29 ... 

Wiem, że mogę podzielić, ale nie mogę uzyskać właściwej składni, jak to zrobić. Jeśli podzielę się na -, to w jaki sposób mogę połączyć te dwie części?

Iterowanie nad tym wydaje się być bardzo uciążliwe.

+0

Mam powiązane pytanie: Co zrobić, jeśli mój ciąg wygląda następująco: 'A-13-27', B-35-42' i chcę słownika tak: A: (13,27), B: (35,42)? – Shushiro

Odpowiedz

12
>>> s = 'A - 13, B - 14, C - 29, M - 99' 
>>> dict(e.split(' - ') for e in s.split(',')) 
{'A': '13', 'C': '29', 'B': '14', 'M': '99'} 

EDIT: Następnym rozwiązaniem jest, gdy chcesz wartości jako liczby całkowite, które myślę, że to, co chcesz.

>>> dict((k, int(v)) for k, v in (e.split(' - ') for e in s.split(','))) 
{'A': 13, ' B': 14, ' M': 99, ' C': 29} 
21

Aby rozwiązać przykład można to zrobić:

mydict = dict((k.strip(), v.strip()) for k,v in 
       (item.split('-') for item in s.split(','))) 

Czyni 3 rzeczy:

  • podzielić ciąg w "<key> - <value>" części: s.split(',')
  • dzielonych każda część do "<key> ", " <value>" parach: item.split('-')
  • usunąć białe znaki z każdej pary: (k.strip(), v.strip())
+1

Woah, teraz czuję się naprawdę głupi. To * nigdy * nie przyszło mi do głowy. – user225312

4
>>> dict((k.strip(),int(v.strip())) for k,v in (p.split('-') for p in s.split(','))) 
{'A': 13, 'B': 14, 'M': 99, 'C': 29} 
+0

+1 Do myślenia o przekształcaniu liczb w liczby całkowite. Chociaż byłbym skłonny rozbić go na dwa etapy, aby był jaśniejszy. –

2
dict((p.split(' - ') for p in s.split(','))) 
0

To powinno działać:

dict(map(lambda l:map(lambda j:j.strip(),l), map(lambda i: i.split('-'), s.split(',')))) 

Jeśli nie chce się rozebrać, po prostu zrobić:

dict(map(lambda i: i.split('-'), s.split(','))) 
+0

Ah! Moje rozwiązania nie konwertują liczb całkowitych! – rubik

1

Oto odpowiedź, która nie użyj wyrażeń generatora i używa replace zamiast strip.

>>> s = 'A - 13, B - 14, C - 29, M - 99' 
>>> d = {} 
>>> for pair in s.replace(' ','').split(','): 
...  k, v = pair.split('-') 
...  d[k] = int(v) 
... 
>>> d 
{'A': 13, 'C': 29, 'B': 14, 'M': 99}