noskill_noname 2020-04-11 18:49 采纳率: 50%
浏览 619
已采纳

Python中sort函数与其中Len()和Lambda的组合

初学Python学的比较零散,有个不懂的问题始终找不到答案,恳望各位前辈赐教下

1 原义是根据字符串中不同字母的数量对一个字符串集合进行排序

2 代码
strings = ['foo', 'card', 'bar', 'aaaa', 'bbbb' ]

strings.sort(key= lamda x : len( set( list(x) ) ) )

输出结果为

strings

['aaaa', 'foo', 'abab', 'bar', 'card']

3 疑问
对于结果没有问题,疑问是

①在 lambda函数中 x是什么, 之前并没有声明x, 但是最后直接出现了list(x), 这样为什么不会出错

② 在之后的len(set(list 中, 我认为不应该是讲strings进行转换成list,然后转换成set了吗,按理说应该是len的是set(也就是里面有5个值结果为5),但是为何它能把这个x变成strings里的每个元素,然后一一list(),set(),len()吗

烦请赐教,感谢各位

  • 写回答

2条回答 默认 最新

  • 正在学C++ 2020-04-11 23:49
    关注

    我觉得你可以先理解一下sort()方法的参数key,然后按照你的理解就行。我举个例子

    li = [[1,7],[2,4],[1,6],[1,5]]
    li.sort()
    结果:[[1, 5], [1, 6], [1, 7], [2, 4]]  # 这个例子中,默认的排序规则是先按照第0维度排序,然后再按照第1维度排序。
    

    我们加key参数进行测试:

    def getone(li):
        return li[1]
    li = [[1,7],[2,4],[1,6],[1,5]]
    li.sort(key = getone)
    结果:[[2, 4], [1, 5], [1, 6], [1, 7]]
    

    你看,我的getone函数甚至没有传入参数,都能运行,为什么?
    因为key参数,就是指定可迭代对象中的一个元素来进行排序。key=getone就已经默认了参数就是li中的每一个对象,这个sort方法对li的每一个元素都执行getone,然后使用得出的结果,来对本来的li进行排序。这个就和你自己的理解对上了,对吧。

    strings.sort(key= lamda x : len( set( list(x) ) ) )
    回过来说你的这个例子,很明显,赋值给x的就是strings的每一个元素。
    

    至于lambda,请看下面:

    def get(x):
        return len( set( list(x) ) )
    strings = ['foo', 'card', 'bar', 'aaaa', 'bbbb' ]
    strings.sort( key= get)    # 结果和你的例子一模一样
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 在线手电筒追加按钮JS
  • ¥15 调用函数时,无关变量的改变引起函数值的改变
  • ¥15 xy坐标转化为经纬度坐标
  • ¥15 一般三角模糊数的上界值和下届值取中值的多少比较合理?
  • ¥15 cuda安装使用问题
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥20 Hbase启动失败,无法启动HMaster
  • ¥20 Lumerical FDTD solutions 中模型的相对阻抗,有效介电常数和有效磁导率的实部和虚部的数据如何获得?
  • ¥100 sql reporting service 远程smtp服务器配置支持
  • ¥15 ppyoloe_r带角度目标检测,loss_cls没法收敛