运行课程上的代码,对一个函数的某个关键操作步骤有些不解,查了一下资料,发现了
(python函数04)zip(*sorted(zip())) - 华子哈 - 博客园zip(*sorted(zip())) 用这个玩意儿可以以对两个迭代对象进行排序。 示例代码01 cnts = [2, 4, 3, 6, 5] boundingBoxes = [(730,https://www.cnblogs.com/huaziha/p/14373528.html这篇博客写的东西,很有启发,在这里记录一下
这个函数的功能是在轮廓检索过程中把找到的轮廓按照相对位置进行排序的操作
import cv2
def sort_contours(cnts, method="left-to-right"):
reverse = False
i = 0
if method == "right-to-left" or method == "bottom-to-top":
reverse = True
if method == "top-to-bottom" or method == "bottom-to-top":
i = 1
boundingBoxes = [cv2.boundingRect(c) for c in cnts] # 用一个最小外接矩形将形状包起来
(cnt, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes), key=lambda b: b[1][i], reverse=reverse))
return cnt, boundingBoxes
(cnt, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes), key=lambda b: b[1][i], reverse=reverse))
参考上面博客的解释,并结合zip()与sorted()函数的用法
zip()函数是将两个列表对应位置的元素打包在一起,并组合成一个大列表的操作
sorted()函数中有几个参数需要注意
首先,sorted 可以对所有可迭代的对象进行排序操作,而不仅仅是列表
语法:sorted(iterable, cmp=None, key=None, reverse=False)
iterable -- 可迭代对象。
cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回 1,小于则返回 - 1,等于则返回 0。
key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
尝试了上面博客中的例子
zip(cnts, boundingBoxes)之后的结果应该类似[2, (730, 20, 54, 85)]
lambda b: b[1][0] 应该就是用于定位,指定sorted()函数以哪个元素进行排序,在这个例子中就是以 730 这个位置的元素进行排序,所以应该是 412, 492, 571, 651, 730 这样的顺序,当然,对应的cnts和其他元素的位置也相应的一起变。
再比如第二个例子
这里设置lambda b: b[0],就是按照 [2, (730, 20, 54, 85)]中的2这个位置的元素进行排序
其实 b 只是匿名函数lambda的“未知数”而已,这个未知数可以是x,可以是a,可以是b,什么都可以的。