파이썬에서 세미콜론으로 구분 된 문자열을 사전으로 분할
-
06-07-2019 - |
문제
나는 다음과 같이 보이는 문자열이 있습니다.
"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)