初学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()吗
烦请赐教,感谢各位
我觉得你可以先理解一下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) # 结果和你的例子一模一样
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,估计你修改了程序,但是贴出来的是以前的。