2012-07-09 97 views
1

我有一個由JSON結果組成的python字典。該字典包含嵌套字典,其中包含嵌套列表,其中包含嵌套字典。還在我這兒?這裏有一個例子:循環遍歷嵌入在字典中的列表

{'hits':{'results':[{'key1':'value1', 
        'key2':'value2', 
        'key3':{'sub_key':'sub_value'}}, 
        {'key1':'value3', 
        'key2':'value4', 
        'key3':{'sub_key':'sub_value2'}} 
        ]}} 

我想從字典裏得到的是每一個sub_keysub_vale並將其存儲在不同的列表。無論我嘗試什麼,我都會收到錯誤。

這是我最後一次嘗試吧:

inner_list=mydict['hits']['results']#This is the list of the inner_dicts 

index = 0 
    for x in inner_list: 
     new_dict[index] = x[u'sub_key'] 
     index = index + 1 

print new_dict 

它印刷的前幾個結果,然後開始在原有的字典返回的一切。我無法理解它。如果我用print聲明替換new_dict[index]行,它會完美地打印到屏幕上。真的需要一些輸入!

for x in inner_list: 
    print x[u'sub_key'] 
+1

請張貼錯誤的輸出。該程序看起來是正確的,所以我有一種感覺,我不明白它在做什麼,這是違揹你期望 – inspectorG4dget 2012-07-09 18:10:13

+0

@ inspectorG4dget只是在那裏運行的確切代碼,並有回溯錯誤'文件「C:\ Python27 \ test.py」 ,第24行,主 newresults [index] = x [u'sub_key'] IndexError:列表分配索引超出範圍 – adohertyd 2012-07-09 18:16:21

+0

如果'newresults'是您發佈爲'new_dict'並且是'list'的列表, ,然後嘗試'append'ing它,而不是分配給一個尚不存在的索引 – inspectorG4dget 2012-07-09 18:33:34

回答

1

做出一些假設後:

[e['key3']['sub_key'] for e in x['hits']['results']] 

要改變每實例:

for e in x['hits']['results']: 
e['key3']['sub_key'] = 1 
+0

謝謝。就是這樣。我最初是一名C程序員,所以我發現Python語法仍然很奇怪。如果我想要改變子鍵的值呢?在sub_value_y的變化sub_value_y – adohertyd 2012-07-09 18:34:45

+0

@adohertyd:例如'x ['hits'] ['results'] [0] ['key3'] ['sub_key'] = y' – 2012-07-09 18:36:58

+0

但在每個實例中更改它呢?如在循環中? – adohertyd 2012-07-09 18:38:23

1

x是對for x in ...

x={'key1':'value1', 
       'key2':'value2', 
       'key3':{'sub_key':'sub_value'}}, 

通知第一次迭代的字典

,有在x沒有鑰匙sub_key而是x['key3']['sub_key']

+0

爲什麼然後,當我做'打印x ['sub_key']'它打印沒有問題? – adohertyd 2012-07-09 18:22:44

+0

它不適合我......這會引發錯誤 ' >>>對於x在內: ...打印X [u'sub_key'] ... 回溯(最近通話最後一個): 文件「」,第2行,在 KeyError:u'sub_key'' – 2012-07-09 18:24:55

+0

從sub_key的前面刪除u對不起 – adohertyd 2012-07-09 18:28:54

1
>>> dic={'hits':{'results':[{'key1':'value1', 
        'key2':'value2', 
        'key3':{'sub_key':'sub_value'}}, 
        {'key1':'value3', 
        'key2':'value4', 
        'key3':{'sub_key':'sub_value2'}} 
        ]}} 
>>> inner_list=dic['hits']['results'] 
>>> [x[y]['sub_key'] for x in inner_list for y in x if isinstance(x[y],dict)] 
['sub_value', 'sub_value2'] 

和如果你確定它的key3總是包含在內dict,則:

>>> [x['key3']['sub_key'] for x in inner_list] 
['sub_value', 'sub_value2'] 

不使用List comprehensions

>>> lis=[] 
>>> for x in inner_list: 
    for y in x: 
     if isinstance(x[y],dict): 
      lis.append(x[y]['sub_key']) 


>>> lis 
['sub_value', 'sub_value2'] 
+1

哇,這是一口!我一點都不會讓自己變得輕鬆! – adohertyd 2012-07-09 18:23:41

+0

非常感謝!正如我對Marco說的,我仍然處於C編程模式,所以python的語法對我來說還是有點奇怪。謝謝。 – adohertyd 2012-07-09 18:36:06

+0

是的,列表理解對於一個新的Python程序員來說很難理解,所以我添加了一個簡單版本的答案(不使用List理解) – 2012-07-09 18:43:28

1

索引錯誤來自new_dict[index]其中index大於new_dict的大小。

應該考慮列表理解。它通常更好,但要幫助理解這是如何在循環中起作用的。試試這個。

new_list = [] 
for x in inner_list: 
    new_list.append(x[u'sub_key']) 

print new_list 

如果你想堅持的字典,而是使用索引的關鍵試試這個:

index = 0 
new_dict = {} 
    for x in inner_list: 
     new_dict[index] = x[u'sub_key'] 
     index = index + 1 

print new_dict 

好了,根據您在下面的意見,我覺得這是你想要的。

inner_list=mydict['hits']['results']#This is the list of the inner_dicts 

new_dict = {} 
for x in inner_list: 
    new_dict[x['key2']] = x['key3']['sub_key'] 

print new_dict 
+0

是的,它是一個更大程序的一部分,我從3本詞典中抽取特定元素,將它們放入列表中,並根據特定標準進行比較。如果我想從原始字典的某些元素創建字典,那麼從列表中我可以更容易地做到這一點。 – adohertyd 2012-07-09 18:39:48

+0

我會怎麼做呢? – adohertyd 2012-07-09 18:42:25

+0

實際上與代碼中的語法非常相似,但您需要一個字符串作爲鍵。 new_dict [key] =值。你想使用哪個元素作爲鍵,哪個元素用於該值。 – ChipJust 2012-07-09 18:44:31

1

你忘了嵌套的水平。

for x in inner_list: 
    for y in x: 
     if isinstance(x[y], dict) and 'sub_key' in x[y]: 
      new_dict.append(x[y]['sub_key'])