python面试题:列表排序有哪几种方法
今天咱们聊聊一个非常经典但又充满玄学的Python面试题:列表排序有哪几种方法?不管你是刚入坑Python的小白,还是熬夜写Bug的老鸟,这种面试题总是让人又爱又恨。毕竟,看似简单,实际却能挖出不少“坑”。
列表排序的几种方法
Python中,排序确实没啥花里胡哨的,常见的也就这几种。但你要是只会sort和sorted,可能面试官就会笑着问你:“还有吗?”🤔
方法一:list.sort()
这是列表自带的原地排序方法,直接修改原始列表,没啥花头。
nums = [3, 1, 4, 1, 5, 9]
nums.sort()
print(nums) # 输出:[1, 1, 3, 4, 5, 9]
特点:
原地修改:不创建新列表,效率高,适合内存紧张的场景。 **返回值是 None**:没错,这货只操作,不返回,想直接赋值可就错了。
方法二:sorted()
这是一个内置函数,不修改原始列表,会返回一个新的已排序列表。
nums = [3, 1, 4, 1, 5, 9]
sorted_nums = sorted(nums)
print(sorted_nums) # 输出:[1, 1, 3, 4, 5, 9]
print(nums) # 原列表不变:[3, 1, 4, 1, 5, 9]
特点:
非破坏性:原数据还在,新的已排序列表是独立的。 用法灵活:可以排序任何可迭代对象,比如字符串、字典的键、甚至生成器。
方法三:reverse=True 来个倒序
面试官可能会问你:能不能倒序排序?很简单,给sort或sorted加个参数就完事了。
nums = [3, 1, 4, 1, 5, 9]
nums.sort(reverse=True)
print(nums) # 输出:[9, 5, 4, 3, 1, 1]
如果用sorted,同样简单:
nums = [3, 1, 4, 1, 5, 9]
sorted_nums = sorted(nums, reverse=True)
print(sorted_nums) # 输出:[9, 5, 4, 3, 1, 1]
方法四:按键排序 (key 参数)
这是排序中的王炸功能!你可以指定按什么规则排序。比如,按字符串长度:
words = ["apple", "banana", "kiwi", "cherry"]
words.sort(key=len)
print(words) # 输出:['kiwi', 'apple', 'cherry', 'banana']
或者,用sorted也一样:
words = ["apple", "banana", "kiwi", "cherry"]
sorted_words = sorted(words, key=len)
print(sorted_words) # 输出:['kiwi', 'apple', 'cherry', 'banana']
甚至可以写个更骚的排序逻辑,比如按字符串最后一个字母排序:
words = ["apple", "banana", "kiwi", "cherry"]
sorted_words = sorted(words, key=lambda x: x[-1])
print(sorted_words) # 输出:['banana', 'cherry', 'apple', 'kiwi']
关键点:
key 参数接收的是函数:你可以传任何能处理单个元素的函数。 key 决定了排序规则,而不是直接按元素本身排序。
“段子时间:面试官:为什么用
key参数?
我:灵活!随心所欲!
面试官点头:能用lambda再写个复杂点的吗?
我:咱用lambda排过队,还用排队吗?😂
延伸:自定义排序算法
有些面试官心眼多,还会问:“Python的内置排序用的什么算法?”如果你没答对,那真的可能凉凉。
答案是:Timsort。这是一种稳定的排序算法,结合了归并排序和插入排序的优点,最坏情况下时间复杂度是O(n log n),最优可以到O(n)。
你可以自己实现个简单的排序算法,比如快速排序:
defquick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
nums = [3, 1, 4, 1, 5, 9]
print(quick_sort(nums)) # 输出:[1, 1, 3, 4, 5, 9]
总结
list.sort()和sorted()是主力,面试中八九不离十会提到。key参数和reverse是加分项,用得好,能把面试官忽悠住。自己实现排序算法只是表演,内置的 Timsort基本够用。
“最后留个问题:面试官可能问你,“为什么sort是原地排序,sorted不是?”其实本质在于:一个是列表方法,设计就是为了操作列表本身;一个是全局函数,更强调灵活性。你怎么看?欢迎留言一起讨论!👨💻
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。