2010-12-16 51 views
6

真的有兩個問題:如果我有一個字典(最初來自解析一個json消息),有一個可選的數組在它:Python:結合「如果'x'在字典中」和「爲我在字典['x']」

dict_with = {'name':'bob','city':'san francisco','kids': {'name': 'alice'} } 
dict_without = {'name':'bob','city':'san francisco' } 

我通常有這樣的代碼:

if 'kids' in dict: 
    for k in dict['kids']: 
     #do stuff 

我的第一個問題是,有沒有什麼蟒蛇辦法的,如果保護和for循環結合起來?

第二個問題是我的直覺告訴我要原來的JSON消息的更好的設計是始終指定孩子元素,只是一個空的字典:

dict_better = {'name':'bob','city':'san francisco','kids': {} } 

我找不到任何設計方法這證實了這一點。 json消息是來自支持json和xml表示的web服務的狀態消息。由於它們是從xml開始的,因此它們使得它的「kids」元素是可選的,這迫使上面的構造檢查在迭代數組之前是否存在元素。我想知道是否需要更好的設計來說明元素(如果沒有元素,只需使用空數組)。

回答

10
for x in d.get("kids",()): 
    print "kid:", x 
7

空序列不會導致迭代。

for k in D.get('kids',()): 
+1

對於任何不知道的人,'dict.get(key,default)'返回與'key'關聯的值(如果存在)或'default'(如果不存在)。 – DGH 2010-12-16 18:50:01

+1

...並且'()'是空的元組。本能地,我會用'[]'去,但是沒有實際的區別。 – delnan 2010-12-16 18:51:35

+0

@delnan很可能你的本能是使用[],因爲許多標準庫函數返回列表,而不管輸入序列類型如何(例如'sorted')。我的本能是喜歡(),因爲它記錄了我沒有做任何需要列表的結果的願望。 ;) – 2010-12-16 22:14:22

4

[x for x in dict_with.get('kids')],您可以使用此filter, map - a functional programming tools與列表理解。

  • 列表理解寫得更簡潔。
  • 運行速度比手動循環語句快得多。
  • 要避免key-error使用dict_with.get('xyz',[])返回一個空的列表。