簡體   English   中英

字典鍵的不同列表值

[英]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以便每個元組鍵都有自己的列表值?

使用itertoolproduct功能和列表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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM