2017-05-26 88 views
0

我試圖從谷歌地圖查詢選擇距離。數據似乎已通過字典返回。但是,我無法訪問我需要的信息。Python字典訪問通過關鍵字(TypeError:列表索引必須是整數或切片,而不是str)

我在看

{'copyrights': 'Map data ©2017 Google', 'warnings': [], 'summary': 'NJ Tpke 
S and I-95 S', 'legs': [{'traffic_speed_entry': [], 'distance': {'value': 
365542, 'text': '227 mi'}, 

我想返回 「227米」 是什麼。

我已經試過低於

>>> dirs[0]['summary'] 
'NJ Tpke S and I-95 S' 
>>> dirs[0]['summary'][0]['traffic_speed_entry'][0] 
Traceback (most recent call last): 
    File "<pyshell#117>", line 1, in <module> 
    dirs[0]['summary'][0]['traffic_speed_entry'][0] 
TypeError: string indices must be integers 

我試圖在這些引用的方法,太:

accessing-elements-of-python-dictionaryinverse-dictionary-lookup-in-python

我也導入到大熊貓,numpy的,並試圖切片。

下面是一個創建字典代碼:

>>> import googlemaps 
>>> from datetime import datetime 
>>> gmaps = googlemaps.Client(key='APIKEY') 
>>> start = '07042' 
>>> end = '20024' 
>>> dirs = gmaps.directions(start, end) 

谷歌是否做一些有趣的事情,當他們返回字典?

+0

>>>迪爾斯[0] [「文本」]回溯(最近通話最後一個)訪問該列表中的第一項: 文件「」第1行,在 dirs [0] ['text'] KeyError:'text'@JuanT – polonius11

+0

對於'traffic_speed_'錯誤,您可以嘗試'dirs [0] ['legs'] [0] ['traffic_speed_entry']' – patrick

+0

@ polonius11我的意思是'dirs [0] ['legs'] [0] ['distance'] ['text']' –

回答

2

「traffic_speed_entry」位於「腿」字段中,而不是「摘要」。讓我們把你的嘗試,一次下標:

dirs[0] 

我假設這是你在第一個代碼框中發佈的項目。

dirs[0]['summary'] 

正如你已經注意到,這是字符串 'NJ Tpke S和I-95 S'。

dirs[0]['summary'][0] 

這是該字符串開頭的字母'N'。

dirs[0]['summary'][0]['traffic_speed_entry'] 

這相當於

'N'['traffic_speed_entry'] 

你試圖索引一個字符串與另一個。

解決方案

您需要正確訪問該字段。

dirs[0]['legs'][0]['distance']['text'] 

我建議您嘗試一次添加一個單一的元素,檢查你得到你所期望的:

>>> dirs = [ {'copyrights': 'Map data 2017 Google', 'warnings': [], 
       'summary': 'NJ Tpke S and I-95 S', 
       'legs': [{'traffic_speed_entry': [], 
         'distance': {'value':365542, 
            'text': '227 mi'}}]}, 
      "other dictionaries" ] 
>>> dirs[0] 
{'legs': [{'traffic_speed_entry': [], 
    'distance': {'text': '227 mi', 'value': 365542}}], 
    'summary': 'NJ Tpke S and I-95 S', 
    'copyrights': 'Map data 2017 Google', 'warnings': []} 
>>> dirs[0]['summary'] 
'NJ Tpke S and I-95 S' 
>>> dirs[0]['summary'][0] 
'N' 
>>> dirs[0]['legs'] 
[{'traffic_speed_entry': [], 
    'distance': {'text': '227 mi', 'value': 365542}}] 
>>> dirs[0]['legs'][0] 
{'traffic_speed_entry': [], 
'distance': {'text': '227 mi', 'value': 365542}} 
>>> dirs[0]['legs'][0]['distance'] 
{'text': '227 mi', 'value': 365542} 
>>> dirs[0]['legs'][0]['distance']['text'] 
'227 mi' 
1

dirs[0]['legs'][0]['distance']['text']應該工作。


這意味着,在從該dirs[0]dict,選擇與主要'legs'元素,這是一個列表。

提取該list的第零個元素,並從該元素(它是dict)中找到鍵'distance'

在那最後的元素找到'text',並返回相應的字符串。


需要注意的是:您試圖訪問traffic_speed_entry不包含您想要的信息。

1

英里你正在尋找的應該是包含另一個字典的字典中是

dirs[0]['legs'][0]['distance']['text'] 

請注意,您有一個列表(legs)!

編輯,基於註釋:

How do I read a list within a dictionary which contains another dictionary?

你只是有點呼叫堆到另一個。另請參閱上面的接受答案。請注意,list是按位置索引的,例如, legs[0]表示legstutorial on lists)中的第一項。這個項目恰好是oyr case中的一個字典(它可能是任何東西,真的)。這個字典與列表不同,可以通過它的鍵訪問,就像你上面做的那樣(tutorial on dicts)。在這裏,我們需要存儲在密鑰distance下的內容。或者,我們可以將鑰匙traffic_speed_entry取出。

That is clearly what confused me. The distance, text is the list? Legs & dirs are the dictionary?

注意列表是通過在Python [],字典表示由{}。列表是事物列表(例如[1,'aaa']),而字典則將鍵與值關聯(例如{key1:1, key2:'aaa'})。試着讀一下你的例子。

你可以組裝你的榜樣,像這樣:

  1. dirs大概是一個列表;我們使用[0]來提取它的第一個項目。

  2. 該項目是一個字典(我們知道,因爲在這個例子中你張貼在{。我們通過調用['legs']提取與關鍵legs關聯的值,這個值恰好是一個列表。

  3. 就像上面我們通過[0]等等

+0

如何讀取包含其他字典的字典中的列表?這顯然讓我困惑。距離,文字是清單?腿和dirs是字典? – polonius11

+0

@ polonius11在上面添加了詳細信息 – patrick

相關問題