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

在Python中对名称列表排序,忽略数字?,python,list,sorting,dictionary,Python,List,Sorting,Dictionary,我希望结果是所有的数字在最后,其余的排序。数字不需要排序。 ['7', 'Google', '100T', 'Chrome', '10', 'Python'] 不过它稍微复杂一点,因为我按值对字典排序 Chrome Google Python 100T 7 10 在两个答案都发布后,我只添加了100T,但接受的答案仍然有效,只是我在评论中发布了一点修改。为了澄清这一点,应该对匹配^[^0-9]的名称进行排序。我一直在努力使字典版本正常工作,因此这里是数组版本供您推断: def sortnam

我希望结果是所有的数字在最后,其余的排序。数字不需要排序。

['7', 'Google', '100T', 'Chrome', '10', 'Python']
不过它稍微复杂一点,因为我按值对字典排序

Chrome
Google
Python
100T
7
10

在两个答案都发布后,我只添加了100T,但接受的答案仍然有效,只是我在评论中发布了一点修改。为了澄清这一点,应该对匹配^[^0-9]的名称进行排序。

我一直在努力使字典版本正常工作,因此这里是数组版本供您推断:

def sortname(k): return get[k]['NAME']
sortedbyname = sorted(get,key=sortname)
基本原则是创建一个元组,该元组的第一个元素将所有字符串分组在一起,然后是所有整数。不幸的是,没有一种优雅的方法可以在不使用异常的情况下确认字符串是否恰好是int,这在lambda中并不太好。我最初的解决方案使用正则表达式,但由于从lambda转换为独立函数,我想我还是选择简单的选项为好

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

sorted(get, key=sortkey)
Python的排序是稳定的,因此您还可以使用多个连续排序:

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

这个函数不会对数字进行排序吗?str.isdigit()函数有什么问题吗?这些数字“不需要排序”,但据推测它们不必保持原来的顺序,either@Fara:int()会忽略多余的空格,isdigit()不会;这真的取决于OP,他的输入是否严格。或者等等,它起作用了。我只是在字典值上使用int(x[:1]),而不是[:1]。python的字典不是无序的吗?@Lie Ryan:它是无序的,这就是它必须排序的原因;)制作一个排序字典是不可能的(除了使用OrderedDict),但是他正在排序一个名字列表(恰好来自嵌套的dict)。。。你对“是数字”的定义是什么?“以数字开头”?-1这个解决方案不适用于OP提出的示例。
100T
不仅仅由数字组成,但显然不需要排序(以及纯数字)。@Guilio:投票否决某人并不太好,因为他们的答案不包括修改后的问题。@Thilo,对不起,我不明白这个例子是后来编辑/添加的。如果可能的话,我会撤销否决票(现在锁定,除非修改答案)。
>>> m = sorted(l)
>>> m.sort(key=str.isdigit)
>>> m
['Chrome', 'Google', 'Python', '10', '7']