【问题标题】:Sort list of names in Python, ignoring numbers?在Python中排序名称列表,忽略数字?
【发布时间】:2011-05-02 18:55:28
【问题描述】:
['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] 的名称进行排序。

【问题讨论】:

  • python的字典不是无序的吗?
  • @Lie Ryan:它是无序的,这就是它必须排序的原因;) 制作排序字典是不可能的(使用 OrderedDict 除外),但他正在对名称列表进行排序(这恰好发生在来自嵌套字典)。
  • 好的,加上这个例子……你对“是一个数字”的定义是什么? “以数字开头”?

标签: python list sorting dictionary


【解决方案1】:

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

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

sorted(get, key=sortkey)

基本原则是创建一个元组,其第一个元素具有将所有字符串组合在一起然后所有整数的效果。不幸的是,没有优雅的方法可以在不使用异常的情况下确认一个字符串是否恰好是一个 int,这在 lambda 中并没有那么好。我最初的解决方案使用了正则表达式,但自从从 lambda 转换为独立函数后,我想我不妨选择简单的选项。

【讨论】:

  • 这不是也对数字进行排序吗?
  • str.isdigit() 函数有什么问题? docs.python.org/library/stdtypes.html#str.isdigit
  • 数字“不需要排序”,但据说它们也不必保持原来的顺序
  • @Fara: int() 会忽略多余的空格, isdigit() 不会;这真的取决于OP,他的输入是否严格。
  • 或者等等,它有效。我只是在字典值上使用 int(x[:1]) 而不是 [:1]。
【解决方案2】:
>>> 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']

【讨论】:

  • -1 此解决方案不适用于 OP 提出的示例。 100T 不是仅由数字组成,但显然不需要排序(以及纯数字)。
  • @Guilio:对某人投反对票并不是一件好事,因为他们的回答没有涵盖修改后的问题。
  • @Thilo,对不起,我不明白该示例是稍后编辑/添加的。如果可能的话,我会撤消否决票(现在锁定,除非修改答案)。
猜你喜欢
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多