[python] 세미콜론으로 구분 된 문자열을 Python에서 사전으로 분할

다음과 같은 문자열이 있습니다.

"Name1=Value1;Name2=Value2;Name3=Value3"

파이썬에 내장 된 클래스 / 함수가 그 문자열을 받아 사전을 구성하는 것입니까? 마치 내가 이것을 한 것처럼 :

dict = {
    "Name1": "Value1",
    "Name2": "Value2",
    "Name3": "Value3"
}

사용 가능한 모듈을 살펴 봤지만 일치하는 항목을 찾을 수 없습니다.


감사합니다. 관련 코드를 직접 만드는 방법을 알고 있습니다.하지만 그러한 작은 솔루션은 일반적으로 발생하기를 기다리는 광산 분야이기 때문에 (예 : 누군가가 Name1 = ‘Value1 = 2’;) 등을 작성합니다. 테스트 된 기능.

그럼 내가 할게.



답변

내장 기능은 없지만 생성기 이해를 통해 상당히 간단하게 수행 할 수 있습니다.

s= "Name1=Value1;Name2=Value2;Name3=Value3"
dict(item.split("=") for item in s.split(";"))

[편집] 업데이트에서 견적을 처리해야 할 수도 있음을 나타냅니다. 이것은 당신이 찾고있는 정확한 형식이 무엇인지에 따라 일을 복잡하게합니다. csv 모듈이 형식을 포함 할 수 있는지 확인하는 것이 좋습니다. 여기에 예가 있습니다. (CSV는 레코드 시퀀스를 반복하도록 설계 되었기 때문에 API는이 예의 경우 약간 어색합니다. 필요에 맞게) :

>>> s = "Name1='Value=2';Name2=Value2;Name3=Value3"

>>> dict(csv.reader([item], delimiter='=', quotechar="'").next()
         for item in csv.reader([s], delimiter=';', quotechar="'").next())

{'Name2': 'Value2', 'Name3': 'Value3', 'Name1': 'Value1=2'}

형식의 정확한 구조에 따라 간단한 파서를 작성해야 할 수도 있습니다.


답변

이것은 당신이 원하는 것을하는 것과 가깝습니다 :

>>> import urlparse
>>> urlparse.parse_qs("Name1=Value1;Name2=Value2;Name3=Value3")
{'Name2': ['Value2'], 'Name3': ['Value3'], 'Name1': ['Value1']}


답변

s1 = "Name1=Value1;Name2=Value2;Name3=Value3"

dict(map(lambda x: x.split('='), s1.split(';')))


답변

문자열 조인 및 목록 이해로 간단하게 수행 할 수 있습니다.

",".join(["%s=%s" % x for x in d.items()])

>>d = {'a':1, 'b':2}
>>','.join(['%s=%s'%x for x in d.items()])
>>'a=1,b=2'


답변

easytiger $ cat test.out test.py | sed 's/^/    /'
p_easytiger_quoting:1.84563302994
{'Name2': 'Value2', 'Name3': 'Value3', 'Name1': 'Value1'}
p_brian:2.30507516861
{'Name2': 'Value2', 'Name3': "'Value3'", 'Name1': 'Value1'}
p_kyle:7.22536420822
{'Name2': ['Value2'], 'Name3': ["'Value3'"], 'Name1': ['Value1']}
import timeit
import urlparse

s = "Name1=Value1;Name2=Value2;Name3='Value3'"

def p_easytiger_quoting(s):
    d = {}
    s = s.replace("'", "")
    for x in s.split(';'):
        k, v = x.split('=')
        d[k] = v
    return d


def p_brian(s):
    return dict(item.split("=") for item in s.split(";"))

def p_kyle(s):
    return urlparse.parse_qs(s)



print "p_easytiger_quoting:" + str(timeit.timeit(lambda: p_easytiger_quoting(s)))
print p_easytiger_quoting(s)


print "p_brian:" + str(timeit.timeit(lambda: p_brian(s)))
print p_brian(s)

print "p_kyle:" + str(timeit.timeit(lambda: p_kyle(s)))
print p_kyle(s)


답변

Value1, Value2가 실제 값에 대한 자리 표시자인 경우 dict()함수를와 함께 사용할 수도 있습니다 eval().

>>> s= "Name1=1;Name2=2;Name3='string'"
>>> print eval('dict('+s.replace(';',',')+')')
{'Name2: 2, 'Name3': 'string', 'Name1': 1}

이것은 dict()함수가 구문을 이해하기 때문 dict(Name1=1, Name2=2,Name3='string')입니다. 문자열의 공백 (예 : 각 세미콜론 뒤)은 무시됩니다. 그러나 문자열 값에는 따옴표가 필요합니다.


답변