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条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?