我创建了一个字典,其中键是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
以便每个元组键都有自己的列表值?
答案 0 :(得分:4)
使用itertool
的{{1}}函数和列表推导,还有另一种方法可以写这个:
product
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)]
中的函数通常可以帮助您避免深度嵌套,列表推导允许您创建列表并将其分配到一行中的字典中(尽管在本示例中我为了可读性而分成两部分)。
实际上,由于python词典是无序的,假设itertools
没有任何副作用,更改GetScalarComponentAsDouble
的循环次序会使代码在生成相同输出时更容易理解。
x, y z
答案 1 :(得分:3)
您可以使用此代码:
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)])
答案 2 :(得分:3)
为了让您的生活更轻松,您可以使用defaultdict
模块中的collections
,在此情况下使用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})
这将实现同样的事情但它将包括两个通常不必要的陈述。