這個怎麼樣:放棄之前的一切,包括@
標誌,然後將每個時期分隔的部分爲整數。這應該解決數字序列按照字典順序排序的問題。
>>> 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'}]
編輯:如果你不能保證字符串以數字序列結尾,則代替rpartition,請嘗試使用re.findall
從字符串中的任何位置提取的數字:
>>> 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'}]
它的關閉!但我需要按照第一個單詞字符串和數字排序,因爲我有一個不同的第一個單詞的贓物,我需要一些像: '[{'title':'After - @ 1.1 copy'},{'title ':'Before - @ 1.1 move'},{'title':'Before - @ 1.2 move'},{'title':'Copy - @ 1.1'},{'title':'Copy - @ 1.2'}]' 但我想我可以分開他們,這麼多坦克! – GRojas
它完美的作品!非常感謝! – GRojas
然後你應該把這個答案標記爲正確的http://stackoverflow.com/help/someone-answers – e4c5