[英]Different list values for dictionary keys
我創建了一個字典,其中鍵是3個元素的元組,值是列表,如下所示:
dic = {}
l = []
for z in range(0,20):
for y in range(0,150):
for x in range(0,200):
for j in range(0,4):
l.append(self.images[j].GetScalarComponentAsDouble(x, y, z, 0))
dic.update({(x,y,z) : l})
print(dic[(25,25,5)])
images
只是圖像數據的列表,從中我獲得強度值並將此值存儲在列表l
。
我希望在字典中看到的最終結果將包含以下形式的項目:
{(...),
(150,120,10): [2,5,3,9],
(130,100,16): [4,1,1,8],
(...)}
但是因為列表總是被附加元素而沒有被重置,所以我無法獲得這個結果。
如何重置列表l
以便每個元組鍵都有自己的列表值?
使用itertool
的product
功能和列表itertool
,還有另一種方法可以寫這個:
from itertools import product
dic = {}
for z, y, x in product(range(20), range(150), range(200)):
dic[x, y, z] = [self.images[j].GetScalarComponentAsDouble(x, y, z, 0)
for j in range(4)]
itertools
函數通常可以幫助您避免深度嵌套,並且列表推導允許您創建列表並將其分配到一行中的字典(盡管在本示例中我為了可讀性而分成兩部分)。
實際上,由於python詞典是無序的,假設你的GetScalarComponentAsDouble
沒有任何副作用,改變x, yz
的循環順序使得代碼在生成相同的輸出時更容易理解。
from itertools import product
dic = {}
for x, y, z in product(range(200), range(150), range(20)):
dic[x, y, z] = [self.images[j].GetScalarComponentAsDouble(x, y, z, 0)
for j in range(4)]
您可以使用此代碼:
dic = {}
for z in range(0,20):
for y in range(0,150):
for x in range(0,200):
l = []
for j in range(0,4):
l.append(self.images[j].GetScalarComponentAsDouble(x, y, z, 0))
dic.update({(x,y,z) : l})
print(dic[(25,25,5)])
為了讓您的生活更輕松,您可以使用collections
模塊中的defaultdict
,並使用此案例的list
進行初始化。 這是他們用例的一個很好的例子:
from collections import defaultdict
dict = defaultdict(list) # initialize with list for values
這將為您創建的每個字典條目創建一個空列表[]
,然后您可以在創建密鑰時 append
到此列表。 對於您的情況,這意味着在最終的for
循環中,您可以直接在字典中附加self.image
:
for j in range(0,4):
dict[(x, y, z)].append(self.images[j].GetScalarComponentAsDouble(x, y, z, 0))
這避免了需要list
可變l
一起。
另一種方法是在實際使用列表的for
循環之前簡單地初始化一個新列表:
for x in range(0,200):
l = [] # create new list
for j in range(0,4):
l.append(self.images[j].GetScalarComponentAsDouble(x, y, z, 0))
dic.update({(x,y,z) : l})
這將實現相同的目的, 但它將包括兩個通常不必要的陳述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.