创建动态字典并在循环中为其分配新键 (Python)

Creating a dynamic dictionary and assigning it new keys in a loop (Python)

你好,希望你们一切都好。

我现在正在做图像处理作业,我需要创建一个灰度图像直方图示例。但是,直方图值将根据用户输入进行设置。让我用一个例子来解释。

如果用户输入 128 作为直方图值,这意味着直方图将有 128 个级别,它们是:

[0, 1], [2, 3], [3, 4], ..... , [254, 255](共 128 组)

如果用户输入 64 作为直方图值,这意味着直方图将有 64 个级别,它们是:

[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], ..... , [252, 253, 254, 255] (共 64 组)

现在我正在尝试创建一个能够根据输入的直方图值创建集合的代码。目前看起来是这样的:

import cv2
import numpy as np
def getHistogram(bin):  

    # Initializing the dictionary and the first key of it:
    rangeDict = {
    "set0": []
    }

    # Acquiring the increment value:
    increment = int(256 / bin)

    # Initializing the start and stop values:
    start = 0
    stop = start + increment
    
    while True:

        # Adding the numbers to the key one after another in a single list, according to the user input:
        for i in range(start, stop):
            rangeDict["set" + str(i)].append(start + i)

        # When 255 is reached in the dictionary, loop will terminate:
        if rangeDict["set" + str(i)][-1] == 255:
            break

        else:
            # Assigning the greatest value in the most recently added key to the start:
            start = rangeDict["set" + str(i)][-1] 
            # Assigning start, plus the increment
            stop = start + increment
            # Initializing the next key:
            rangeDict["set" + str(i + 1)] = []
    # Printing the dictionary for checking:
    print(rangeDict)

# main:
getHistogram(128)

然而,当我 运行 代码时,我得到“KeyError: set1”。但是我没想到会出现这种错误,因为我在循环中初始化了新密钥。我错过了什么吗?如果我能够创建直方图集,剩下的就很容易了。预先感谢您的帮助!

问题是rangeDict["set" + str(i)].append(start + i)

它试图将 rangeDict["set" + str(i)] 作为列表获取,但由于它不存在,因此无法追加,因此它抛出一个 KeyError.

拆分为

try:


   rangeDict["set" + str(i)].append(start + i)

except KeyError:
    rangeDict["set" + str(i)] = [start +i]

您只发起set0。 循环 for i in range(start, stop): 实际上也会尝试 set1set2 等,此时这些还没有启动。

您可以通过 rangeDict.get("set" + str(i)) 添加支票,也可以将 rangeDict 设为 defaultdict(list)


# ...

from collections import defaultdict

# ...

rangeDict = defaultdict(list)

这本质上省去了初始化的需要,你可以直接对任何值x做rangeDict[x].append(y)