python中sort()函数的key参数用法(转载)

今天在学习匿名函数lambda的时候遇到了一个没怎么想明白的问题。

<span style="color:#000000"><code class="language-python">strings <span style="color:#a67f59">=</span> <span style="color:#999999">[</span><span style="color:#50a14f">'foo'</span><span style="color:#999999">,</span> <span style="color:#50a14f">'card'</span><span style="color:#999999">,</span> <span style="color:#50a14f">'bar'</span><span style="color:#999999">,</span> <span style="color:#50a14f">'aaaa'</span><span style="color:#999999">,</span> <span style="color:#50a14f">'abab'</span><span style="color:#999999">]</span>
<span style="color:#708090"># 根据字符串中不同字母的数量对一个字符串集合进行排序</span>
strings<span style="color:#999999">.</span>sort<span style="color:#999999">(</span>key<span style="color:#a67f59">=</span><span style="color:#0077aa">lambda</span> x<span style="color:#999999">:</span> <span style="color:#50a14f">len</span><span style="color:#999999">(</span><span style="color:#50a14f">set</span><span style="color:#999999">(</span><span style="color:#50a14f">list</span><span style="color:#999999">(</span>x<span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">)</span>
</code></span>

上面strings输出的结果为:[‘aaaa’, ‘foo’, ‘abab’, ‘bar’, ‘card’]
结果是明白的,但是过程一开始没弄清楚。
后来百度了一下,参考了别人的解析才弄明白。
主要是了解sort()函数中参数key的意思:
传递给key参数的是一个函数,它指定可迭代对象中的每一个元素来按照该函数进行排序
举个例子:

<span style="color:#000000"><code class="language-python"><span style="color:#708090"># 这里先看一个不带key参数的sort()函数,大家很容易知道结果</span>
li <span style="color:#a67f59">=</span> <span style="color:#999999">[</span><span style="color:#999999">[</span><span style="color:#986801">1</span><span style="color:#999999">,</span> <span style="color:#986801">7</span><span style="color:#999999">]</span><span style="color:#999999">,</span> <span style="color:#999999">[</span><span style="color:#986801">1</span><span style="color:#999999">,</span> <span style="color:#986801">5</span><span style="color:#999999">]</span><span style="color:#999999">,</span> <span style="color:#999999">[</span><span style="color:#986801">2</span><span style="color:#999999">,</span> <span style="color:#986801">4</span><span style="color:#999999">]</span><span style="color:#999999">,</span> <span style="color:#999999">[</span><span style="color:#986801">1</span><span style="color:#999999">,</span> <span style="color:#986801">1</span><span style="color:#999999">]</span><span style="color:#999999">]</span>
li<span style="color:#999999">.</span>sort<span style="color:#999999">(</span><span style="color:#999999">)</span>
<span style="color:#0077aa">print</span><span style="color:#999999">(</span>li<span style="color:#999999">)</span>  
<span style="color:#708090"># [[1, 1], [1, 5], [1, 7], [2, 4]] 默认按照0维排序 再按照1维排序</span>

<span style="color:#0077aa">def</span> <span style="color:#dd4a68">fun</span><span style="color:#999999">(</span>li<span style="color:#999999">)</span><span style="color:#999999">:</span>
	<span style="color:#0077aa">return</span> li<span style="color:#999999">[</span><span style="color:#986801">1</span><span style="color:#999999">]</span>
<span style="color:#708090"># 这时将函数fun传递给参数key 得出结果</span>
li<span style="color:#999999">.</span>sort<span style="color:#999999">(</span>key<span style="color:#a67f59">=</span>fun<span style="color:#999999">)</span>
<span style="color:#0077aa">print</span><span style="color:#999999">(</span>li<span style="color:#999999">)</span> <span style="color:#708090"># [[1, 1], [2, 4], [1, 5], [1, 7]]</span>
</code></span>

我们可以发现好像是li中每个子元素的第二个数进行排序。
这就是key参数的作用,传入了key参数的sort()函数对li中的每个子元素[1,7],[1,5],[2,4],[1,1]都执行了fun()函数,返回它们的第1个数,分别为7,5,4,1。然后再排序得到1,4,5,7。使的出的结果对本来的li进行排序最后就得到了[[1,1],[2,4],[1,5],[1,7]]。
上述用lambda可以表示为:li.sort(key=lambda li: li[1]),这里的后面两个li是变量名,可以随意取如li.sort(key=lambda x: x[1])
最后我们再来解释一下这句:

<span style="color:#000000"><code class="language-python"><span style="color:#708090"># 根据字符串中不同字母的数量对一个字符串集合进行排序</span>
strings<span style="color:#999999">.</span>sort<span style="color:#999999">(</span>key<span style="color:#a67f59">=</span><span style="color:#0077aa">lambda</span> x<span style="color:#999999">:</span> <span style="color:#50a14f">len</span><span style="color:#999999">(</span><span style="color:#50a14f">set</span><span style="color:#999999">(</span><span style="color:#50a14f">list</span><span style="color:#999999">(</span>x<span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">)</span>
</code></span>

按照字符串不同字母的数量对一个字符串集合进行排序,字符串不同字母的数量,可以想到利用set集合的不重复性,于是想到利用len函数求出set集合的长度,再按照长度进行排序即可。这里赋值给x的就是strings中的每一个元素(key参数的作用)。
好了,就介绍到这,希望大家有所收获~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值