2014-02-18 3 views
0

파이썬 목록의 요소에 액세스하려고합니다. JSON 객체 구문 분석 행을 수행 한 후에 값에 액세스 할 수 없습니다.파이썬 사전에 액세스하는 방법

: 올바르게 대안

TypeError: string indices must be integers, not str 
{u'name': u'machine', u'value': 71.3, u'time': 136.648} 

다음 작품 :

data2 = '{"time": 136.648, "name": "machine", "value":71.3}' 
data2 = json.loads(data2) 
print data2 
print data2 ['time'] 

출력 :

data1 = [{u'time': 136.648, u'name': u'machine', u'value': 71.3}]; 
data1 = str(data1)[1:-1] 
print data1 
print data1 ['time'] 

DATA1에서 '시간'값 잡는 오류를 범

{u'name': u'machine', u'value': 71.3, u'time': 136.648} 
136.648 

왜 작동합니까? data1과 data2는 같은 것으로 보입니다.

는 내가 그것의 내부 데이터에 액세스 할 수 있도록이 목록을 구문 분석 할 :

data = [{u'time': 136.648, u'name': u'machine', u'value': 71.3}, {u'time': 138.648, u'name': u'machine2', u'value': 71.56}]; 

답변

3

첫 번째 경우에는 "{u'name': u'machine', u'value': 71.3, u'time': 136.648}" 문자열이 있습니다. 이것은 사전이 아닙니다. 문자열입니다. 문자열의 문자열 키에 액세스하려고하지만 문자열에 문자열 키가 없으며 정수 인덱스 만 있습니다.

두 번째 경우 JSON을 통해 문자열을 구문 분석하고 사전에 액세스 한 다음 액세스합니다.

아마도이 도움이 될 것입니다 : 유래에서 발견

>>> a = [{u'time': 136.648, u'name': u'machine', u'value': 71.3}] 
>>> b = str(a)[1:-1] 
>>> c = '{"time": 136.648, "name": "machine", "value":71.3}' 
>>> d = json.loads(c) 

>>> a 
[{u'name': u'machine', u'value': 71.3, u'time': 136.648}] 
>>> type(a) 
<type 'list'> 
>>> a[0] 
{u'name': u'machine', u'value': 71.3, u'time': 136.648} 
>>> a[0]['time'] 
136.648 

>>> b 
"{u'name': u'machine', u'value': 71.3, u'time': 136.648}" 
>>> type(b) 
<type 'str'> 
>>> b[0] 
'{' 
>>> b['time'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: string indices must be integers, not str 

>>> c 
'{"time": 136.648, "name": "machine", "value":71.3}' 
>>> type(c) 
<type 'str'> 
>>> c[0] 
'{' 
>>> c['time'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: string indices must be integers, not str 

>>> d 
{u'name': u'machine', u'value': 71.3, u'time': 136.648} 
>>> type(d) 
<type 'dict'> 
>>> d['time'] 
136.648 
+0

왜 downvote를 물어 볼 수 있습니까? – Claudiu

0

당신이 사전의 목록이 첫 번째 경우 : data1= str(data1)[1:-1] 제거하고 print data1[0]['time']을 사용하여 얻을합니다.

+0

이 문자열을 디코딩한다. – user2357112

+0

예 아니오 @ user2357112. 첫 번째 줄 다음에 dicts 목록이지만 두 번째 줄은 대괄호가 제거 된 문자열로 변환됩니다. – mhlester

+0

ok 이것이 가장 간단한 방법입니다. – method3325177

2

이 할 때 :

data1 = [{u'time': 136.648, u'name': u'machine', u'value': 71.3}]; 
data1 = str(data1)[1:-1] 
print data1 # string 
print type(data1)  # => prints out <type 'str'> 
print data1 ['time'] # accessing a string without an index doesn't work 

당신은 문자열의 인덱스를 액세스하려고합니다.

다음은 문자열로 합법적 인 JSON있는 데이터로드했기 때문에 작품을 다음

data2 = '{"time": 136.648, "name": "machine", "value":71.3}' 
data2 = json.loads(data2) 
print data2 
print type(data2) # => prints out <type 'dict'> 
print data2 ['time'] 

data1이 작동하지 않습니다 : 그것은 DICT 때문에

data2 일을하고, data1은 문자열이며 숫자 인덱스 또는 슬라이스 이외의 문자로 문자열에 액세스 할 수 없기 때문에 작동하지 않습니다.

-1

이 코드는`data1`이 첫 번째 예에서 문자열 당신 (Fastest way to convert a dict's keys & values from `unicode` to `str`?)

ATA = { u'spam': u'eggs', u'foo': frozenset([u'Gah!']), u'bar': { u'baz': 97 }, 
    u'list': [u'list', (True, u'Maybe'), set([u'and', u'a', u'set', 1])]} 

def convert(data): 
    if isinstance(data, basestring): 
     return str(data) 
    elif isinstance(data, collections.Mapping): 
     return dict(map(convert, data.iteritems())) 
    elif isinstance(data, collections.Iterable): 
     return type(data)(map(convert, data)) 
    else: 
     return data 

print DATA 
print convert(DATA) 
# Prints: 
# {u'list': [u'list', (True, u'Maybe'), set([u'and', u'a', u'set', 1])], u'foo': frozenset([u'Gah!']), u'bar': {u'baz': 97}, u'spam': u'eggs'} 
# {'bar': {'baz': 97}, 'foo': frozenset(['Gah!']), 'list': ['list', (True, 'Maybe'), set(['and', 'a', 'set', 1])], 'spam': 'eggs'} 
+0

질문자는 유니 코드 요소를'str'로 변환하려하지 않습니다. – user2357112

+0

그 방법입니다 : 내 최종 목표는 내가 그 내부의 데이터에 액세스 할 수 있도록이 목록을 구문 분석하는 것입니다 – Epitouille

+0

그는 유니 코드와 함께 그걸 잘 할 수 있습니다. – user2357112

관련 문제