ProgramingTip

세미콜론으로 구분 된 분열을 Python에서 사전으로 분할

bestdevel 2020. 10. 12. 07:53
반응형

세미콜론으로 구분 된 분열을 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는이 예의 경우 약간 어색합니다. 따라서 .next () 호출은 첫 번째 줄만 보려고합니다 ..에 맞게) :

>>> 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 in d.items ()])

>>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}

이것은 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)

참고 URL : https://stackoverflow.com/questions/186857/splitting-a-semicolon-separated-string-to-a-dictionary-in-python

반응형