python - 如何使用关键函数在Python中按填充字符串属性排序

标签 python sorting

假设 l 是具有字符串属性 x 的类 c 的对象列表。 l 应根据以下标准进行排序: 对于任意两个项目:在最后一个斜杠字符处拆分 x,取后缀,在两者前面添加零填充,使它们长度相等,然后按字母顺序比较它们。 我读到应该使用 python 中的 key 函数进行排序。但是,我无法找出任何方法来以这种方式实现所需的排序标准。如果关键功能不是实现所需排序的正确方法,我很高兴使用“正确”方法提供解决方案。

最佳答案

使用按键功能来做到这一点有点棘手;使用自定义比较函数会更容易。 Python 2 支持排序 的自定义比较函数,但 Python 3 不支持。但是,使用键函数进行排序比使用自定义比较函数要高效得多:键函数仅对列表中的每个项目调用一次,而必须为调用自定义比较函数>进行的每一次比较。

解决这个问题的“关键”是要认识到,只要被比较的两个字符串的长度相等,每个字符串前面有多少个零并不重要。所以我们只需要确定数据中最长字符串的长度,并将所有字符串填充到该长度。

要确定该长度,我们可以使用一个相对简单的生成器表达式,该表达式使用 rsplit 来获取最后一个斜杠之后的字符串部分的长度,并将这些长度传递给内置的 最大函数。然后我们可以在关键函数中使用该最大长度。

以下代码适用于 Python 2,但如果您修复 show 函数中的 print 语句,它也适用于 Python 3。

#!/usr/bin/env python

data = [
    'a/bc/this',
    'a/bc/is',
    'a/bc/a',
    'a/bc/short',
    'a/bc/test',
    'a/bc/123',
    'a/bc/24',
    'a/bc/5',
]

#Simple sequence printer
def show(seq):
    for row in seq:
        print row
    print

#Get maximum length of the string after the last slash in each data string
maxlen = max(len(s.rsplit('/', 1)[1]) for s in data)

#Key function that pads the string after the last slash
key = lambda s: s.rsplit('/', 1)[1].rjust(maxlen, '0')

#Test the key function
show([(s, key(s)) for s in data])

new_data = sorted(data, key=key)
show(new_data)

输出

('a/bc/this', '0this')
('a/bc/is', '000is')
('a/bc/a', '0000a')
('a/bc/short', 'short')
('a/bc/test', '0test')
('a/bc/123', '00123')
('a/bc/24', '00024')
('a/bc/5', '00005')

a/bc/5
a/bc/a
a/bc/24
a/bc/is
a/bc/123
a/bc/test
a/bc/this
a/bc/short
<小时/>

我不知道 Timsort 如何使用键函数进行排序的具体细节,但它相当于:

  1. 将项目列表转换为(键、项目)元组列表。
  2. 对元组列表进行排序,仅按键排序并忽略项目。
  3. 通过从已排序列表的元组中删除项目来重建新的项目列表。

这只是一个粗略的指南,因为 Timsort 是用 C 编写的。

关于python - 如何使用关键函数在Python中按填充字符串属性排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29878708/

相关文章:

c++ - 使用函数对字符串数组进行排序

python - 使用 Robot Framework 截取整个网页的屏幕截图

python - 蝗虫:得到 0 个响应 status_code 和无内容

python - 使用 IPython Notebook 获取输出

c - 在 c 中按字典顺序打印 trie

python如何在一行中排序列表并返回它

python - GStreamer 总线发送 None 消息

python - 允许调整窗口大小 pyGame

C# 基本字典排序 只需要清除错误

java - 按日期对 HashMap 进行排序