1356. 根据数字二进制下 1 的数目排序

 

sort()函数:

  sort()函数是原址排序,字符串、元组没有sort()方法——因为均不可修改。

  如果需要一个排序好的副本,同时保持原有列表不变,可以这样操作:

1   x =[4, 6, 2, 1, 7, 9]
2 
3   y = x[ : ]
4 
5   y.sort()

  注:y = x[ : ] 通过分片操作将列表x的元素全部拷贝给y,如果简单的把x赋值给y(y = x),y和x还是指向同一个列表,并没有产生新的副本。

  实例:sort(key, reverse=False)

  参数列表:

  key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序;

  reverse是排序规则,默认false(升序排列),true(降序排列)。

 

 sorted()函数

  sorted()用于对可迭代对象进行排序(可迭代对象包括列表、字典、set、甚至是字符串)。

  sorted()排序会保留原list。

  实例:sorted(arr, cmp=None, key=lambda num: (bin(num)[2:].count('1'), num), reverse=False)

  参数列表:

  arr是可迭代对象;

  cmp -- 可以自定义的比较函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。

  key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。上例中有两个排序依据:首先是arr中各元素取二进制,其中‘1’字符的个数,其次是元素本身的数值大小——即将数组中的元素按照其二进制表示中数字 1 的数目升序排序。如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列;

  reverse是排序规则,默认false(升序排列),true(降序排列)。

  返回值:排好序的list——set经sorted()后也返回list。

 

 python中的进制转换内置函数

本题有两个排序条件:

二进制中‘1’的个数、十进制数值大小,因此用sort()和sorted()都可实现。

代码如下。

 1 class Solution(object):
 2     def sortByBits(self, arr):
 3         """
 4         :type arr: List[int]
 5         :rtype: List[int]
 6         """
 7         arr.sort(key=lambda num: (bin(num)[2:].count('1'), num), reverse=False)
 8         return arr
 9 
10     def sortByBits2(self, arr):
11         """
12         :type arr: List[int]
13         :rtype: List[int]
14         """
15         return sorted(arr, key=lambda num: (bin(num)[2:].count('1'), num), reverse=False)
16 
17 
18 if __name__ == '__main__':
19     solution = Solution()
20     print(solution.sortByBits(arr=[0, 1, 7, 8, 2, 3, 4, 5, 6]))
原文地址:https://www.cnblogs.com/panweiwei/p/12712756.html