我有一系列的词组,如:
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
答案 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'}]