在Python中排序名称列表,忽略数字?

时间:2010-10-30 11:22:05

标签: python list sorting dictionary

['7', 'Google', '100T', 'Chrome', '10', 'Python']

我希望结果是最后的所有数字,其余的排序。这些数字无需排序。

Chrome
Google
Python
100T
7
10

虽然稍微复杂一点,因为我按价值对字典进行排序。

def sortname(k): return get[k]['NAME']
sortedbyname = sorted(get,key=sortname)

在两个答案都已发布后我才添加了100T,但接受的答案仍然适用于我在评论中发布的略微修改。为了澄清,应该对匹配^ [^ 0-9]的名称进行排序。

2 个答案:

答案 0 :(得分:3)

我一直在努力让词典版本正常工作,所以这里是你推断的数组版本:

def sortkey(x):
    try:
        return (1, int(x))
    except:
        return (0, x)

sorted(get, key=sortkey)

基本原则是创建一个元组,它的第一个元素具有将所有字符串分组在一起然后所有整数的效果。不幸的是,没有优雅的方法可以确认字符串是否恰好是一个int而不使用异常,这在lambda中并不是很好。我的原始解决方案使用正则表达式,但自从从lambda转移到独立函数后,我想我也可以选择简单的选项。

答案 1 :(得分:1)

>>> l = ['7', 'Google', 'Chrome', '10', 'Python']
>>> sorted(l, key=lambda s: (s.isdigit(), s))
['Chrome', 'Google', 'Python', '10', '7']

Python的排序是稳定的,因此您也可以使用多个连续排序:

>>> m = sorted(l)
>>> m.sort(key=str.isdigit)
>>> m
['Chrome', 'Google', 'Python', '10', '7']