문제

나는 다음과 같이 보이는 문자열이 있습니다.

"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는 일련의 레코드를 통해 반복하도록 설계되었으므로, 첫 번째 줄을 보려고하는 .next () 호출을 통해 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(';')))

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

','. 조인

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

value1, value2는 실제 값의 자리 표시 자일 뿐이라면 dict() 함께 기능합니다 eval().

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

이것은 Beacuse입니다 dict() 함수 구문을 이해합니다 dict(Name1=1, Name2=2,Name3='string'). 문자열의 공백 (예 : 각 세미콜론 후)은 무시됩니다. 그러나 문자열 값은 인용이 필요하다는 점에 유의하십시오.

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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top