字典键的不同列表值

时间:2015-11-05 11:48:50

标签: python list dictionary

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

3 个答案:

答案 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})

这将实现同样的事情它将包括两个通常不必要的陈述。