如何减少 python 中的多个 if 语句

How to reduce multiple if statement in python

我有以下代码片段:

amountLst = []
for i in range(9):
    hsv = ""
    if i == 0:
        hsv = cv2.cvtColor(barc0Img, cv2.COLOR_BGR2HSV)
    elif i == 1:
        hsv = cv2.cvtColor(barc1Img, cv2.COLOR_BGR2HSV)
    elif i == 2:
        hsv = cv2.cvtColor(barc2Img, cv2.COLOR_BGR2HSV)
    elif i == 3:
        hsv = cv2.cvtColor(barc3Img, cv2.COLOR_BGR2HSV)
    elif i == 4:
        hsv = cv2.cvtColor(barc4Img, cv2.COLOR_BGR2HSV)
    elif i == 5:
        hsv = cv2.cvtColor(barc5Img, cv2.COLOR_BGR2HSV)
    elif i == 6:
        hsv = cv2.cvtColor(barc6Img, cv2.COLOR_BGR2HSV)
    elif i == 7:
        hsv = cv2.cvtColor(barc7Img, cv2.COLOR_BGR2HSV)
    elif i == 8:
        hsv = cv2.cvtColor(barc8Img, cv2.COLOR_BGR2HSV)
    lower_bound = np.array([0, 80, 80])
    upper_bound = np.array([20, 255, 255])
    mask = cv2.inRange(hsv, lower_bound, upper_bound)
    amountLst.append(mask)

如您所见,我正在检查 i 的值并根据它选择合适的 hsv。有没有更好的方法通过避免多个 if 语句来做到这一点。谢谢

您可以使用包含 barc<int>Img:

的列表
barcImg = [
    barc0Img,
    barc1Img,
    barc2Img,
    ...
]


amountLst = []
for i in range(9):
    hsv = cv2.cvtColor(barcImg[i], cv2.COLOR_BGR2HSV)
    lower_bound = np.array([0, 80, 80])
    upper_bound = np.array([20, 255, 255])
    mask = cv2.inRange(hsv, lower_bound, upper_bound)
    amountLst.append(mask)

首先将您的 barcXImg 引用放入列表中:

barcImages = [barc0Img, barc1Img, barc2Img, barc3Img, barc4Img, barc5Img, barc6Img, barc7Img, barc8Img]

只计算一次上限和下限(因为它们似乎不依赖于其他任何东西):

lo = np.array([0, 80, 80])
hi = np.array([20, 255, 255])

然后您可以通过理解来构建您的列表:

amountLst = [cv2.inRange(cv2.cvtColor(img, cv2.COLOR_BGR2HSV), lo, hi) for img in barcImages]

我建议你创建一个模拟 switch-case

的函数
def switch(argument):
    switcher = {
        0: cv2.cvtColor(barc0Img, cv2.COLOR_BGR2HSV),
        1: cv2.cvtColor(barc1Img, cv2.COLOR_BGR2HSV),
        2: cv2.cvtColor(barc2Img, cv2.COLOR_BGR2HSV),
        3: cv2.cvtColor(barc3Img, cv2.COLOR_BGR2HSV),
        4: cv2.cvtColor(barc4Img, cv2.COLOR_BGR2HSV),
        5: cv2.cvtColor(barc5Img, cv2.COLOR_BGR2HSV),
        6: cv2.cvtColor(barc6Img, cv2.COLOR_BGR2HSV),
        7: cv2.cvtColor(barc7Img, cv2.COLOR_BGR2HSV),
        8: cv2.cvtColor(barc8Img, cv2.COLOR_BGR2HSV),
    }
    return switcher.get(argument, "nothing")

amountLst = []
argument = yourArgument  # 0,1,2,3,....
hsv = switch(argument)
lower_bound = np.array([0, 80, 80])
upper_bound = np.array([20, 255, 255])
mask = cv2.inRange(hsv, lower_bound, upper_bound)
amountLst.append(mask)