2012-06-11 4 views
3

에 사전에 문자열을 변환 I 다음 문자열이 있습니다파이썬

str = "{application.root.category.id:2}" 

내가 같이 파이썬에서 사전 데이터 형식으로 위를 변환하고 싶습니다 :

dict = {application.root.category.id:2} 

내가 사용 시도를 평가() 그리고 이것은 내가 가진 오류입니다 :

AttributeError: java package 'application' has no attribute "root"

나의 현재 파이썬은 < 2.3이며 내가 UPD 수 없습니다 파이썬을 2.3 이상으로 먹었습니다.

모든 솔루션?

+1

은 무엇 사전 항목의 열쇠가 될 것인가? – pepr

+1

'java 패키지 '를 설명 할 수 있습니까? – wong2

+1

'{application.root.category.id : 2}'또는'{ "application.root.category.id": 2}'를 원하십니까? 문제는'application.root.category.id'를 평가할 수 없다는 것입니다. – Eric

답변

3

먼저 'dict'는 변수 이름에 적합하지 않은 형식 이름입니다.

다음, 당신은 ...

a_dict = dict([str.strip('{}').split(":"),]) 

물었다 않습니다 정확하게 그러나 내가 예상 한대로, 당신은 사전에 더 많은 매핑을 추가하려는 경우에, 다른 접근 방식이 필요합니다. 가정하자

4

파이썬 사전에는 문자열 일 필요가없는 키가 있습니다. 따라서 {a: b}을 쓸 때 문자열 인 경우 a 주위에 따옴표가 필요합니다.

그래서 당신은 당신이 eval에있는 종류의 무언가를 전달할 수 없습니다 ({1:2}는, 예를 들어, 정수 (2)에 정수 1 매핑). 직접 파싱해야합니다. (또는 키가 생길 때마다 키 주위에 따옴표를 넣으십시오.)

정확하게 구문 분석하는 방법은 사전이 실제로 어떻게 표시되는지에 따라 달라집니다. 예를 들어 값 자체가 사전이 될 수 있습니까, 아니면 항상 숫자입니까, 아니면 무엇입니까?

contents = str[1:-1]  # strip off leading { and trailing } 
items = contents.split(',') # each individual item looks like key:value 
pairs = [item.split(':',1) for item in items] # ("key","value"), both strings 
d = dict((k,eval(v)) for (k,v) in pairs) # evaluate values but not strings 
+2

보안상의 이유로, 평범한'eval (v)'대신'int (v)'또는'eval (v, {}, {})'를 사용하고 싶습니다. 'eval ("os.remove ('/ tmp/a')", {}, {})'('name 'os'가 정의되지 않았다. ') ")'("해당 파일이나 디렉토리가 없습니다 :'/ tmp/a ' "). –

+2

예. 일반적으로'eval' (특히 간단한 one-arg 형식)을 사용하는 것은 나쁘고 나쁜 생각입니다. 나는 OP가했기 때문에 그저 게으르다 .--). –

0

내가 가진 문자열

str='{1:0,2:3,3:4}' 
str=str.split('{}') 
mydict={} 
for every in str1.split(','): 
    z=every.split(':') 
    z1=[] 
    for every in z: 
     z1.append(int(every)) 
    for k in z1: 
     mydict[z1[0]]=z1[1] 

출력 : mydict {1: 0, 2: 1, 3: 4}