[英]sort a list containing strings with digits at beginning and end of string
我需要對包含字符串開頭和結尾的數字的字符串列表進行排序,首先按開頭數字,然后按結尾數字。 所以開頭的數字優先於結尾的數字。
例如:
l = ['900abc5', '3000abc10', '1000abc5', '1000abc10', '900abc20']
會成為:
l = ['900abc5', '900abc20','1000abc5','1000abc10','3000abc10']
我知道 l.sort() 在這里不起作用,因為它按字典順序排序。 我嘗試過的任何其他方法似乎都過於復雜(例如:通過匹配開頭數字分割字符串,然后通過結尾數字再次分割,排序,連接,然后重新組合列表)即使總結該方法也表明它效率不高!
編輯:在玩弄 natsort 模塊后,我發現 natsorted(l) 解決了我的特定問題。
您可以創建一個自定義函數來從字符串中提取數字並將該函數用作sorted()
的鍵。
例如:在下面的函數中,我使用正則表達式來提取數字:
import re
def get_nums(my_str):
return list(map(int, re.findall(r'\d+', my_str)))
請參閱Python:從字符串中提取數字以獲取更多替代方案。
然后使用get_nums()
作為鍵調用 sorted 函數:
>>> l = ['900abc5', '3000abc10', '1000abc5', '1000abc10', '900abc20']
>>> sorted(l, key=get_nums)
['900abc5', '900abc20', '1000abc5', '1000abc10', '3000abc10']
注意:根據你的例子,我的正則表達式假設只有在字符串的開頭和結尾會有一個數字,字符串中的所有中間字符都是非數字的。
這是一個帶有正則表達式的選項,用於找出前導數字和尾隨數字,並將它們用作sorted
函數中的鍵:
import re
sorted(l, key = lambda x: (int(re.findall("^\d+", x)[0]), int(re.findall("\d+$", x)[0])))
# ['900abc5', '900abc20', '1000abc5', '1000abc10', '3000abc10']
Python 的sorted
方法允許指定一個key
參數,它應該是一個將列表元素轉換為排序值的函數。 在您的情況下,您希望按字符串中的數字排序。 例如'900abc5'
,鍵是[900, 5]
,依此類推。 因此,您希望傳入一個將字符串轉換為數字列表的key
函數。
使用正則表達式,很容易從字符串中提取數字。 您需要做的就是將數字映射到實際數字,因為正則表達式返回字符串匹配。
我相信下面的代碼應該可以工作:
import re
l = ['900abc5', '3000abc10', '1000abc5', '1000abc10', '900abc20']
def by_digits(e):
digits_as_string = re.findall(r"\d+", e)
return map(int, digits_as_string)
sorted(l, key=by_digits)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.