当前位置: 首页 > 面试题库 >

PHP的natsort函数的Python类似物(使用“自然顺序”算法对列表进行排序)

傅博瀚
2023-03-14
问题内容

我想知道Python中是否有类似于PHP natsort函数的东西?

l = ['image1.jpg', 'image15.jpg', 'image12.jpg', 'image3.jpg']
l.sort()

给出:

['image1.jpg', 'image12.jpg', 'image15.jpg', 'image3.jpg']

但我想得到:

['image1.jpg', 'image3.jpg', 'image12.jpg', 'image15.jpg']

更新

基于此链接的解决方案

def try_int(s):
    "Convert to integer if possible."
    try: return int(s)
    except: return s

def natsort_key(s):
    "Used internally to get a tuple by which s is sorted."
    import re
    return map(try_int, re.findall(r'(\d+|\D+)', s))

def natcmp(a, b):
    "Natural string comparison, case sensitive."
    return cmp(natsort_key(a), natsort_key(b))

def natcasecmp(a, b):
    "Natural string comparison, ignores case."
    return natcmp(a.lower(), b.lower())

l.sort(natcasecmp);

问题答案:

从我对自然排序算法的回答:

import re
def natural_key(string_):
    """See http://www.codinghorror.com/blog/archives/001018.html"""
    return [int(s) if s.isdigit() else s for s in re.split(r'(\d+)', string_)]

例:

>>> L = ['image1.jpg', 'image15.jpg', 'image12.jpg', 'image3.jpg']
>>> sorted(L)
['image1.jpg', 'image12.jpg', 'image15.jpg', 'image3.jpg']
>>> sorted(L, key=natural_key)
['image1.jpg', 'image3.jpg', 'image12.jpg', 'image15.jpg']

要支持Unicode字符串,.isdecimal()应使用而不是.isdigit()。请参阅@phihag的注释中的示例。相关:如何显示Unicode数值属性。

.isdigit()int()在某些语言环境中,Python 2上的字节串也可能会失败(返回值不被接受),例如,在Windows的cp1252语言环境中,该字符串可能会失败(“ \ xb2”(“²”))



 类似资料:
  • 问题内容: 我有一个清单 我想按1. 2. 3.的顺序对其进行排序。 结果: 我在stackoverflow中看到了其他类似的问题,但是没有类似的问题或对我容易适用。 问题答案: 我们在这里所做的全部工作是通过为列表中的每个元素而不是整个列表返回一个整数来提供一个新的元素进行排序。我们 可以 使用内联三元表达式,但这会有点麻烦。

  • 本文向大家介绍python使用sorted函数对列表进行排序的方法,包括了python使用sorted函数对列表进行排序的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python使用sorted函数对列表进行排序的方法。分享给大家供大家参考。具体如下: python提供了sorted函数用于对列表进行排序,并且可以按照正序或者倒序进行排列 希望本文所述对大家的Python程序设计有

  • 问题内容: 我有一个数组数组: 需要按特定顺序进行: 3452342 5867867 7867867 1231233 我将如何去做?我之前已经对数组进行了排序,并阅读了许多其他文章,但它们始终基于比较(即valueA <valueB)。 感谢帮助。 问题答案: 您可以用来精确指示如何对数组进行排序。在这种情况下,可以在比较函数中使用该数组。 下面的示例使用a 使生活更轻松。 这项工作的关键是使要比

  • 问题内容: 我在Python中有两个列表 我想对第一个列表进行排序,并使用结果对第二个列表进行排序。 换句话说,结果应为: 我知道如何分别对每个列表进行排序,但是如何使用对另一个列表进行排序所产生的索引排列来对一个列表进行排列呢? 问题答案: 施瓦兹变换

  • 问题内容: 我有一个列表列表(由于必须动态生成它,所以不能是元组),它的结构为一个int和一个float的列表列表,像这样: 我想对它进行排序,但我只能设法获得内置的排序功能,以便按列表的第一个元素对其进行排序,或者什么也不做,但是我需要按列表的第二个元素对它们进行排序,但是我没有不想实现我自己的排序功能。所以我想要的一个例子是: 有人可以告诉我如何获取内置的排序功能之一来执行此操作吗? 问题答案

  • 问题内容: 我正在为我的通讯录应用程序实现排序功能。 我想排序一个。是一个包含四个字段的类:姓名,家庭电话,手机号码和地址。我想继续。 如何编写自定义排序功能来做到这一点? 问题答案: 这是有关订购对象的教程: Java教程-集合-对象排序 尽管我会举一些例子,但我还是建议你阅读它。 有多种排序方式。如果要定义自然的(默认)排序,则需要让实现。假设你想默认在上进行排序name,然后执行(为简单起见