字典键的不同列表值

2024-05-19 22:11:10 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: inself元素列表for字典updaterange
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)])

有另一种编写方法,使用itertoolproduct函数和列表理解:

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

为了让您的生活更轻松一些,您可以使用^{}模块中的^{},在这种情况下,使用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})

这将实现相同的功能,但它将包含两个通常不必要的语句。你知道吗

相关问题 更多 >