문제

나는 이 문제를 몇 번 겪었지만 간단한 해결책을 찾을 수 없는 것 같습니다.문자열이 있다고 가정해 보세요.

string = "a=0 b=1 c=3"

a, b, c가 키이고 0, 1, 3이 각각의 값(int로 변환됨)인 사전으로 변환하고 싶습니다.분명히 나는 ​​이것을 할 수 있습니다 :

list = string.split()
dic = {}
for entry in list:
    key, val = entry.split('=')
    dic[key] = int(val)

하지만 저는 for 루프를 별로 좋아하지 않습니다. 너무 단순해서 일종의 목록 이해 표현식으로 변환할 수 있어야 할 것 같습니다.그리고 이는 약간 더 간단한 경우에 작동합니다. val 문자열이 될 수 있습니다.

dic = dict([entry.split('=') for entry in list])

그러나 즉시 val을 int로 변환해야 하며 이와 같은 작업을 수행하는 것은 구문상 올바르지 않습니다.

dic = dict([[entry[0], int(entry[1])] for entry.split('=') in list])

그래서 내 질문은 다음과 같습니다목록 이해를 사용하여 for 루프를 제거하는 방법이 있습니까?그렇지 않다면, 나를 위해 그렇게 할 수 있는 Python 메서드가 내장되어 있습니까?

도움이 되었습니까?

해결책

이 말인가요?

>>> dict( (n,int(v)) for n,v in (a.split('=') for a in string.split() ) )
{'a': 0, 'c': 3, 'b': 1}

다른 팁

목록 이해력이 없는 한 줄짜리는 어떻습니까?

 foo="a=0 b=1 c=3"
 ans=eval( 'dict(%s)'%foo.replace(' ',',')) )
 print ans
{'a': 0, 'c': 3, 'b': 1}

다음을 시도해 보세요:

dict([x.split('=') for x in s.split()])

나는 때때로 이 접근 방식을 좋아하는데, 특히 키와 값을 만드는 논리가 더 복잡할 때 그렇습니다.

s = "a=0 b=1 c=3"

def get_key_val(x):
    a,b = x.split('=')
    return a,int(b)

ans = dict(map(get_key_val,s.split()))

요즘에는 아마도 2.7에 도입된 사전 이해 기능을 사용해야 할 것입니다:

mydict = {key: int(value) for key, value in (a.split('=') for a in mystring.split())}

사전 이해력이 더 빠르고 더 밝습니다(제 생각에는 더 읽기 쉽습니다).

from timeit import timeit

setup = """mystring = "a=0 b=1 c=3\""""
code1 = """mydict = dict((n,int(v)) for n,v in (a.split('=') for a in mystring.split()))""" # S.Lott's code
code2 = """mydict = {key: int(value) for key, value in (a.split('=') for a in mystring.split())}"""

print timeit(code1, setup=setup, number=10000) # 0.115524053574
print timeit(code2, setup=setup, number=10000) # 0.105328798294
from cgi import parse_qsl
text = "a=0 b=1 c=3"
dic = dict((k, int(v)) for k, v in parse_qsl(text.replace(' ', '&')))
print dic

인쇄물

{'a': 0, 'c': 3, 'b': 1}

나는 이렇게 할 것이다:

def kv(e): return (e[0], int(e[1]))
d = dict([kv(e.split("=")) for e in string.split(" ")])

나는 S.Lott의 솔루션을 좋아하지만 또 다른 가능성을 생각해 냈습니다.
이미 작성하는 방식과 유사한 문자열이 있으므로 이를 Python 구문에 적용한 다음 eval()하면 됩니다. :)

import re
string = "a=0 b=1 c=3"
string2 = "{"+ re.sub('( |^)(?P<id>\w+)=(?P<val>\d+)', ' "\g<id>":\g<val>,', string) +"}"
dict = eval(string2)
print type(string), type(string2), type(dict)
print string, string2, dict

여기의 정규식은 매우 원시적이며 가능한 모든 Python 식별자를 포착할 수는 없지만 단순화를 위해 단순하게 유지하고 싶었습니다.물론 입력 문자열이 생성되는 방법을 제어할 수 있는 경우 Python 구문에 따라 생성하고 평가하면 됩니다.하지만 물론 거기에 코드가 삽입되지 않았는지 확인하기 위해 추가 온전성 검사를 수행해야 합니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top