创建动态字典并在循环中为其分配新键 (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):
实际上也会尝试 set1
、set2
等,此时这些还没有启动。
您可以通过 rangeDict.get("set" + str(i))
添加支票,也可以将 rangeDict
设为 defaultdict(list)
# ...
from collections import defaultdict
# ...
rangeDict = defaultdict(list)
这本质上省去了初始化的需要,你可以直接对任何值x做rangeDict[x].append(y)
。
你好,希望你们一切都好。
我现在正在做图像处理作业,我需要创建一个灰度图像直方图示例。但是,直方图值将根据用户输入进行设置。让我用一个例子来解释。
如果用户输入 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):
实际上也会尝试 set1
、set2
等,此时这些还没有启动。
您可以通过 rangeDict.get("set" + str(i))
添加支票,也可以将 rangeDict
设为 defaultdict(list)
# ...
from collections import defaultdict
# ...
rangeDict = defaultdict(list)
这本质上省去了初始化的需要,你可以直接对任何值x做rangeDict[x].append(y)
。