首页 > 解决方案 > 按自定义键对字符串列表进行排序

问题描述

我最近有一个现场编码面试,被要求解决一个相对简单的问题:

给定一个任意顺序的双字符字符串列表,编写一个返回相同字符串列表的函数,首先按包含字母和数字字符的字符串升序排序,然后是纯数字字符串升序排序。

我能够通过以下方法相当快地解决这个问题:

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()接受带有自定义排序标准函数的“关键”参数,但我无法弄清楚实现这一点的逻辑。在过去的几个小时里,我一直在努力解决这个问题,以提高自己的教益,但我很难过。这甚至是提高解决方案效率的正确方法吗?有没有更好的方法我没有想到?

标签: pythonstringsorting

解决方案


不是最干净的解决方案,但可以完成工作。

>>> polelist.sort(key = lambda x : (x.isnumeric(), len(x)))
['1a', '1b', '2a', '2b', '3c', 'a1', 'aa', '1', '2', '3', '10', '13', '20', '30']

逻辑是首先按 bool 排序(是否为数字),然后按字符串的长度作为较大的数字 --> 较大的长度和相同长度的数字本质上是排序的。


推荐阅读