Python在末尾对带有点/分隔数字和字符串的字符串进行排序

时间:2017-06-05 14:07:32

标签: python sorting

我有一系列的词组,如:

array_x = [{'title': 'Copy -- @1.1 true files'}, {'title': 'Copy -- @1.11 true files'}, {'title': 'Copy -- @1.3 true files'}, {'title': 'Copy -- @1.2 true files'}, {'title': 'Copy -- @1.12 true files'}, {'title': 'Copy -- @1.22 true files'}, {'title': 'After -- @1.1 copy files'}]

我想按键'标题'对它们进行排序,我尝试使用comun sort函数,有些像这样:

array_x.sort(key=lambda s: list(map(str, s['title'].split('.'))))

但是没有用,我想要这样的:

[{'title': 'After -- @1.1 copy files'}, {'title': 'Copy -- @1.1 true files'}, {'title': 'Copy -- @1.2 true files'}, {'title': 'Copy -- @1.3 true files'}, {'title': 'Copy -- @1.11 true files'}, {'title': 'Copy -- @1.12 true files'}, {'title': 'Copy -- @1.22 true files'}]

我正在使用Python 3.6.1

1 个答案:

答案 0 :(得分:1)

如何做到这一点:丢弃@符号之前的所有内容,然后将每个句点分隔的部分转换为整数。这应该解决数字序列按字典顺序排序的问题。

>>> array_x = [{'title': 'Copy -- @1.1'}, {'title': 'Copy -- @1.11'}, {'title': 'Copy -- @1.3'}, {'title': 'Copy -- @1.2'}, {'title': 'Copy -- @1.12'}, {'title': 'Copy -- @1.22'}, {'title': 'After -- @1.1'}]
>>> array_x.sort(key=lambda s: list(map(int, s['title'].rpartition("@")[2].split('.'))))
>>> array_x
[{'title': 'After -- @1.1'}, {'title': 'Copy -- @1.1'}, {'title': 'Copy -- @1.2'}, {'title': 'Copy -- @1.3'}, {'title': 'Copy -- @1.11'}, {'title': 'Copy -- @1.12'}, {'title': 'Copy -- @1.22'}]

编辑:如果你不能保证字符串以数字序列结束,那么请尝试使用re.findall从字符串中的任何位置提取数字,而不是rpartition:

>>> import re
>>> array_x = [{'title': 'Copy -- @1.1 copy file'}, {'title': 'Copy -- @1.11 true files'}, {'title': 'Copy -- @1.3 true files'}, {'title': 'Copy -- @1.2'}, {'title': 'Copy -- @1.12'}, {'title': 'Copy -- @1.22'}, {'title': 'After -- @1.1'}]
>>> array_x.sort(key=lambda s: list(map(int, re.findall(r"\d+", s['title']))))
>>> array_x
[{'title': 'Copy -- @1.1 copy file'}, {'title': 'After -- @1.1'}, {'title': 'Copy -- @1.2'}, {'title': 'Copy -- @1.3 true files'}, {'title': 'Copy -- @1.11 true files'}, {'title': 'Copy -- @1.12'}, {'title': 'Copy -- @1.22'}]

编辑第2部分:如果你想根据标题的文字内容打破关系,把它放在带有数字列表内容的元组中:

>>> array_x.sort(key=lambda s: (list(map(int, re.findall(r"\d+", s['title']))), s['title']))
>>> array_x
[{'title': 'After -- @1.1'}, {'title': 'Copy -- @1.1 copy file'}, {'title': 'Copy -- @1.2'}, {'title': 'Copy -- @1.3 true files'}, {'title': 'Copy -- @1.11 true files'}, {'title': 'Copy -- @1.12'}, {'title': 'Copy -- @1.22'}]