2016-06-23 156 views
0

我在python非常新手,我目前正在學習這門語言。我發現數組(關聯數組)被稱爲python中的字典({}) 我正面臨一個問題。我需要建立一個字典並在for循環中更新它。我的代碼如下。Python更新字典到字典

loc = {} 
result = { I get the list of records from database here, which has id and status } 
for res in result: 
    temp={} 
    temp['id']= res.id 
    temp['status'] = res.status 
    loc.update(temp) # this replaces the values every time, i want append 

print loc 
下面

是我所期望的結果:

loc = { {'id' : 123 , 'status' : 'available' }, 
     { 'id' : 456 , 'status' : 'unavailable'} 
     } 

有人可以幫助我。我嘗試過:

loc = [] # [] this works with loc.append(temp) 
this gives result as : 
[{'id' : 123 , 'status' : 'available'},{'id' : 456 , 'status' : 'unavailable'}] 

但我需要上面的結果與字典在Python中的字典。

+2

您預期的結果'loc'不是字典,因爲它不包含鍵和值。在一個詞典的字典中,你的鍵值是字典。你打算用什麼作爲鑰匙?爲什麼'loc'需要成爲詞典的詞典?如您的底部結果所示,一系列的字典似乎正常工作。 – MattDMo

+0

字典是一個鍵值對(由關鍵字索引)。現在外字典的關鍵是什麼? – SuperSaiyan

+0

爲什麼loc是一本字典? –

回答

1

你說什麼是你想要的輸出:

loc = { 
    {'id' : 123 , 'status' : 'available' }, 
    {'id' : 456 , 'status' : 'unavailable'} 
} 

不會是一個dict。如果它工作的話,它將是一個set

set不能包含dict,因爲它不可哈希。一個集合只能包含可哈希元素,因爲它使用散列進行快速查找。 (可哈希項或者是完全不可變的,或者它所經歷的任何變異都不會影響哈希值。注意,不影響哈希值意味着它不會影響相等性。一般而言,確保可哈希值的東西是不變的只是更容易。)

在字典中,你必須必須有一個。您所需的輸出不會描述每個內部密鑰dict,因此dict不是您想要的數據結構。你可能想要的正是你發現的作品:

loc = [ 
    {'id' : 123 , 'status' : 'available' }, 
    {'id' : 456 , 'status' : 'unavailable'} 
] 

這是一個list。 A list是保存一系列元素的前往數據結構。通過指數的它

for i in loc: 
    print(i) 

或訪問元素:您可以遍歷它

loc[2] 

這可能是你想要的。還有更多你可以用它做,比如slice它,但我不會在這裏找到一切。

您在示例代碼中調用的update函數用於獲取輸入dict中的每個密鑰,併爲其添加密鑰/值對或更新現有密鑰的值。您可能會認爲這是將「dict」參數「合併」爲點之前的那個。這就是爲什麼它每次都重寫所有的值。這就是它應該如何工作。 Python的文檔非常好,當你的行爲不符合你的期望時,你就想養成諮詢的習慣。

+0

感謝jpmc26獲取重要信息 – user280960

2

如果id是獨一無二的,它似乎更可能是你真正想要的只是一個dict映射idstatus

for res in result: 
    loc[res.id] = res.status 

如果您遍歷loc.viewitems()(PY 3中,只loc.items()),你會得到tuple s表示對每個idstatus; Python使用tuple作爲「匿名輕量級對象」的排序,因此它與您嘗試構建的dictset非常類似。用這樣的方式,可以通過id高效地查找值(loc[someid],會得到相關status如果id存在或者提高KeyError),同時仍然能夠有效地遍歷他們:

for ID, status in loc.viewitems(): 
    # do stuff with ID and status 

dictlist A S使查找O(n)任務(其中dict普通dict大致爲O(1)查找),並使迭代更難看一點,要求您使用operator.itemgetter來編寫類似的解包環路,或者需要手動查找每個項目的idstatus ,這是醜陋的至少。它的記憶效率也低得多;相對於單個較大的dict,每兩個項目dict支付相當可觀的內存開銷。

另一個需要考慮的方法是,如果你真的希望它的行爲更像JS對象,則使用collections.namedtuple。這是一種dict像;訪問用點語法,不帶支架的語法鍵的屬性,但它更多的內存效率,這是不變的,所以它可以在set去:

from collections import namedtuple 

Record = namedtuple('Record', 'id status') 

loc = {Record(res.id, res.status) for res in result} 

然後,您可以使用namedtuple像一個普通的tuple(所以for ID, status in loc:作品),或使用命名屬性的訪問,而不是:

for record in loc: 
    print(record.id, record.status) 
+0

感謝ShadowRanger – user280960

0

您可以通過添加新條目或鍵值對,修改現有條目,或刪除現有條目更新詞典,如圖所示簡單的例子

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'} 

dict['Age'] = 8; # update existing entry 
dict['School'] = "DPS School"; # Add new entry 


print "dict['Age']: ", dict['Age'] 
print "dict['School']: ", dict['School'] 

來源:iodocs