создать список списков из строки - PullRequest
4 голосов
/ 01 марта 2011

Я хочу преобразовать строку, такую ​​как 'a = b, a = c, a = d, b = e' в набор списков {'a': ['b', 'c', 'd' ], 'b': ['e']} в Python 2.6.

Мое текущее решение таково:

def merge(d1, d2):
    for k, v in d2.items():
        if k in d1:
            if type(d1[k]) != type(list()):
                d1[k] = list(d1[k])
            d1[k].append(v)
        else:
            d1[k] = list(v)
    return d1

record = 'a=b,a=c,a=d,b=e'

print reduce(merge, map(dict,[[x.split('=')] for x in record.split(',')]))

, что, я уверен, излишне сложно.

Есть ли лучшие решения?

Ответы [ 4 ]

13 голосов
/ 01 марта 2011
d = {}
for i in 'a=b,a=c,a=d,b=e'.split(","):
    k,v = i.split("=")
    d.setdefault(k,[]).append(v)
print d

или, если вы используете python> 2.4, вы можете использовать defaultdict

from collections import defaultdict

d = defaultdict(list)
for i in 'a=b,a=c,a=d,b=e'.split(","):
    k,v = i.split("=")
    d[k].append(v)
print d
6 голосов
/ 01 марта 2011
>>> result={}
>>> mystr='a=b,a=c,a=d,b=e'
>>> for k, v in [s.split('=') for s in mystr.split(',')]:
...     result[k] = result.get(k, []) + [v]
... 
>>> result
{'a': ['b', 'c', 'd'], 'b': ['e']}
0 голосов
/ 01 марта 2011

Использование регулярных выражений позволяет выполнить работу двух разбиений только в одном:

import re

ch ='a=b,a=c ,a=d,   b=e'

dic = {}
for k,v in re.findall('(\w+)=(\w+)\s*(?:,|\Z)',ch):
    dic.setdefault(k,[]).append(v)

print dic
0 голосов
/ 01 марта 2011

Как насчет ...

STR = "a=c,b=d,a=x,a=b"
d = {} # An empty dictionary to start with.

# We split the string at the commas first, and each substr at the '=' sign
pairs = (subs.split('=') for subs in STR.split(','))

# Now we add each pair to a dictionary of lists.
for key, value in pairs:
    d[key] = d.get(key, []) + [value]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...