使用Python 3.x,我有一个字符串列表,我想对其执行自然的字母排序.
自然排序: Windows中文件的排序顺序.
例如,以下列表是自然排序的(我想要的):
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']
Run Code Online (Sandbox Code Playgroud)
这是上面列表的"排序"版本(我有):
['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9']
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个行为与第一个类似的排序函数.
我想QTreeWidget按alpha_numeric专栏排序.
更新:
按照ekhumoro的例子,我重新实现了QTreeWidgetItem __lt__使用所需自然排序的方法.
相关代码:
class TreeWidgetItem(QtGui.QTreeWidgetItem):
def __lt__(self, other):
column = self.treeWidget().sortColumn()
key1 = self.text(column)
key2 = other.text(column)
return self.natural_sort_key(key1) < self.natural_sort_key(key2)
@staticmethod
def natural_sort_key(key):
regex = '(\d*\.\d+|\d+)'
parts = re.split(regex, key)
return tuple((e if i % 2 == 0 else float(e)) for i, e in enumerate(parts))
Run Code Online (Sandbox Code Playgroud)
更新完整的工作示例:
import sys
import re
from PySide import QtGui, QtCore
data = [
{"name": "Apple", "alpha_numeric": "11"},
{"name": "Apple", "alpha_numeric": "125b"},
{"name": …Run Code Online (Sandbox Code Playgroud) 我试图解决如何在python中将字母数字集排序为Django中提出的问题的答案.我有一个查询返回的Django模型实例列表,我无法弄清楚如何使用lambda构建一个优雅(或其他!)排序函数.
如果我的模型包含'name'属性 - 例如
result = Take.objects.all()
for i in result:
print i.name
Run Code Online (Sandbox Code Playgroud)
如何通过name属性对结果对象列表进行排序并应用多个测试?
即我的名字值可以是'1A','1','A1','001A'等
例如,给出这个顺序(基于名称)
1A
2A
10A
A1
A2
A10
A11
B2
B4
Run Code Online (Sandbox Code Playgroud)