以下哪种方法最简单地对字符串列表排序?

2024-05-29 04:26:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个可以表示整数和名称的字符串列表。 默认字符串比较执行以下操作:

sorted(['1','2','3','4','10','102','14','Alice','John','Sally'])
['1', '10', '102', '14', '2', '3', '4', 'Alice', 'John', 'Sally']

我想对名单进行如下排序:

^{pr2}$

也就是说:

  1. 对表示整数的所有字符串进行数字排序
  2. 按字母顺序对“real”字符串进行排序,并将此列表附加到(1)中

我试过使用compare方法,但是我不知道如何在不使用try/except的情况下清楚地确定字符串是否代表整数?在

提前谢谢


Tags: 字符串名称列表排序顺序字母数字整数
3条回答

以下内容在Python 2和Python 3中都适用:

l = ['1','2','3','4','10','102','14','Alice','John','Sally','33']
num, alpha = [], []
[num.append(elem) if elem.isdigit() else alpha.append(elem) for elem in l]
result = sorted(num, key=int) + sorted(alpha)
print(result)

它通过对列表进行分区来避免将字符串与int进行比较。避免这种比较的原因是它要么是not fully specified(Python2)要么是禁止的(Python3)。在

如果没有负数:

lyst = ['1','2','3','4','10','102','14','Alice','John','Sally']
print sorted(lyst, key=lambda k: int(k) if k.isdigit() else k)

以下是一个不依赖CPython细节并与Python 3配合使用的版本:

^{pr2}$

这里的键是元组。元组中的第一项是数字或文本的0或1,这将导致数字在文本之前排序。然后,元组中的第二项是值,这将导致值在其组中进行适当的排序。我最初使用float("+inf")使文本项按数字排序,但这种方法(受tomzych的答案启发)更简单、更快。在

如果希望字符串排序不区分大小写,只需添加.lower()

sorted(lyst, key=lambda k: (0, int(k)) if k.isdigit() else (1, k.lower()))

这应该适用于具有键函数的sort版本。在

def sortkey(s):
    try:
        n = int(s)
        return (0, n)
    except ValueError:
        return (1, s)

相关问题 更多 >

    热门问题