python - 按自定义键对字符串列表进行排序
问题描述
我最近有一个现场编码面试,被要求解决一个相对简单的问题:
给定一个任意顺序的双字符字符串列表,编写一个返回相同字符串列表的函数,首先按包含字母和数字字符的字符串升序排序,然后是纯数字字符串升序排序。
我能够通过以下方法相当快地解决这个问题:
polelist = ['13', '2', '20', '3', '30', '1a', '1b', '1', '3c', '2a', 'a1', '2b', '10', 'aa']
def sortpoles(poles):
alphapoles = []
numpoles = []
for item in poles:
if item.isnumeric():
numpoles.append(item)
else:
alphapoles.append(item)
numpoles = [int(x) for x in numpoles]
numpoles.sort()
numpoles = [str(x) for x in numpoles]
alphapoles.sort()
alphapoles.extend(numpoles)
return alphapoles
这返回:['1a', '1b', '2a', '2b', '3c', 'a1', 'aa', '1', '2', '3', '10', '13', '20', '30']
这是正确的答案。
剩下的时间,他们问我是否可以找到更有效的方法来做到这一点。我知道两者都sort()
可以sorted()
接受带有自定义排序标准函数的“关键”参数,但我无法弄清楚实现这一点的逻辑。在过去的几个小时里,我一直在努力解决这个问题,以提高自己的教益,但我很难过。这甚至是提高解决方案效率的正确方法吗?有没有更好的方法我没有想到?
解决方案
不是最干净的解决方案,但可以完成工作。
>>> polelist.sort(key = lambda x : (x.isnumeric(), len(x)))
['1a', '1b', '2a', '2b', '3c', 'a1', 'aa', '1', '2', '3', '10', '13', '20', '30']
逻辑是首先按 bool 排序(是否为数字),然后按字符串的长度作为较大的数字 --> 较大的长度和相同长度的数字本质上是排序的。
推荐阅读
- java - 如何在不需要授权的端点上启用 CORS
- wordpress - 手动更新我的 Wordpress 站点(使用 FTP)后,在我的 wordpress 仪表板上,我仍然得到“WordPress 的更新版本可用”。
- c# - MSBuild - 将来自 editorconfig 的警告视为错误(在构建期间强制执行)
- docker - 如何用很少的端口构建 dockerfile
- node.js - 错误:传入的参数必须是 12 个字节的单个字符串或 24 个十六进制字符的字符串,同时使用自己生成的 id 插入
- sql - Oracle SQL 将日期维度表与另一个关于日期值的表连接起来
- angularjs - 使用 - injector.get() 实例化 Angular JS 服务
- python - Python中的编译时常量
- excel - Excel VBA 多行文本框以 RTL 语言添加额外的行
- python - 使用时间戳创建注释列表