字典键的不同列表值

3
我创建了一个字典,其中键是由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,以便每个元组键都有自己的列表值?


1
for x... 循环内部添加 l=[],在 for j... 之前。 - tmdavison
尝试在 dic.update 中使用制表符,然后将 l 更改为 l[-1]。 - wgwz
3个回答

4

使用itertoolsproduct函数和列表推导式可以以另一种方式编写此代码:

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,y,z可以使代码更易于理解,同时产生相同的输出。

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)]

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)])

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))

这样做可以彻底省去那个名为 llist 变量的需求。
另一种方法是在实际使用列表的 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})

这将实现相同的效果,但它将包括两个通常不必要的语句。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接