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 依据报错在原代吗格式的基础上解决问题
  • ¥15 在虚拟机中安装flash code
  • ¥15 单片机stm32f10x编写光敏电阻调节3.3伏大功率灯亮度(光强越大灯越暗,白天正常光强灯不亮,使用ADC,PWM等模块)望各位找一下错误或者提供一个可实现功能的代码
  • ¥20 verilog状态机方法流水灯
  • ¥15 pandas代码实现不了意图
  • ¥15 GD32H7 从存储器到外设SPI传输数据无法重复启用DMA
  • ¥25 LT码在高斯信道下的误码率仿真
  • ¥45 渲染完成之后将物体的材质贴图改变,自动化进行这个操作
  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?