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

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)    # 结果和你的例子一模一样
    
    5 打赏 评论
  • threenewbee 2020-04-11 22:38

    lambda表达式相当于一个函数,x是函数的参数,这个可以随意。
    比如说

    def myfunc(x):
        return  len( set( list(x) ) ) 
    

    strings.sort(key= myfunc )
    这么写理解么?
    x是参数,所以可以随意,比如说

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

    至于为什么是
    len( set( list(x) ) )
    这个要看你的题目
    你这个是按照字符串种不同字符的个数排序
    list(x)是把字符串的每个字符提取出来
    比如 'aaaa' 成为 ['a','a','a','a']
    foo成为['f','o','o']
    ...
    set是对这个列表去重复
    比如
    ['a','a','a','a']
    成为
    ['a']
    ['f','o','o'] 成为 ['f', 'o']
    然后是取长度
    'foo', 'card', 'bar', 'aaaa', 'bbbb'
    去掉重复字符后,长度分别是
    2 4 3 1 1
    经过排序,那么就是
    'aaaa', 'bbbb' ,'foo','bar', 'card'
    虽然aaaa和bbbb都是1,但是因为原始序列中aaaa在前面,所以排序算法是稳定的情况下,结果也是aaaa在前面。

    不知道为什么你最后成了abab,估计你修改了程序,但是贴出来的是以前的。

    问题解决的话,请点下采纳

    打赏 评论

相关推荐 更多相似问题