这一段代码是在做计数排序,就是分别统计0,1,2,3,4,5,6,7,8,9,10出现的个数,然后按照由大到小的顺序输出,有多个少就输出多少次。
例如10出现次数为零,所以输出0个10。8出现一次,所以输出1个8。5出现两次,所以输出2个5。最后的结果为:8,5,5,3,2。
score=[5,3,5,2,8]
a = [score.count(i) for i in range(11)]
print([ i for i in range(10, -1, -1) for x in range(a[i])])
备注:原文中第三行为print([ i for i in range(10, 0, -1) for x in range(a[i])])
,但是实际是range(10, 0, -1)
要取到-1才行,否则的话不会输出关于0的排序结果。
重点在于第三行的print,这种一行的写法在Python里面很常见,下面来分析下。这一行也可以写成:
for i in range(10, -1, -1):
for x in range(a[i]):
print(i)
一开始你可能会很好奇,为什么最后是输出i
啊?我们来分析下每个for循环的含义就知道了。
在运行完第二行后,a=[0, 0, 1, 1, 0, 2, 0, 0, 1, 0, 0]
。
第一个for循环,i
分别为10,9,8,7,6,5,4,3,2,1,0;
第二个for循环,先看a[i]
,假设i=10
,此时a[10]=0
,含义即为数组中10出现的次数为0。因此for x in range(a[10])
为for x in range(0)
,此时x
不会等于任何值,因为for循环没有执行就直接结束循环了。
再举个例子,i=5
,此时a[5]=2
,因此for x in range(a[5])
为for x in range(2)
,因此x
会分别等于0和1,也就是for循环里面的内容会执行两次,所以就是输出2次i
,即输出2次5.
现在在回过头去看这两段循环的含义就很明了了。
- 第一个for循环的
i
表示的就是目前输出的是第几个数,可以理解为 - 第二个for循环的
x
实际上没有意义,只是for的语法需要所以不能空着不写。
第二个for循环这样要做的事情就是,循环输出N次某一个数字,仅仅只是为了循环而已。
那么要输出哪一个数字呢?也就是i
的值;
那么要输出多少次呢?也就是a[i]
的值。
i
在这一段代码里高效地运用了很多次,实在是太巧妙了。。
参考:https://segmentfault.com/q/1010000003044229