2017-06-05 59 views
-1

我有類型的字典像一個數組:用點/分隔的數字和字符串Python的排序串末

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排序功能和一些像這樣:

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

這個怎麼樣:放棄之前的一切,包括@標誌,然後將每個時期分隔的部分爲整數。這應該解決數字序列按照字典順序排序的問題。

>>> 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'}] 
+0

它的關閉!但我需要按照第一個單詞字符串和數字排序,因爲我有一個不同的第一個單詞的贓物,我需要一些像: '[{'title':'After - @ 1.1 copy'},{'title ':'Before - @ 1.1 move'},{'title':'Before - @ 1.2 move'},{'title':'Copy - @ 1.1'},{'title':'Copy - @ 1.2'}]' 但我想我可以分開他們,這麼多坦克! – GRojas

+0

它完美的作品!非常感謝! – GRojas

+0

然後你應該把這個答案標記爲正確的http://stackoverflow.com/help/someone-answers – e4c5