关于zip(*sorted(zip()))操作的解释

运行课程上的代码,对一个函数的某个关键操作步骤有些不解,查了一下资料,发现了

(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 升序(默认)。

参考来自:Python sorted() 函数 | 菜鸟教程

尝试了上面博客中的例子

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,什么都可以的。

  • 14
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值