簡體   English   中英

對包含字符串開頭和結尾帶有數字的字符串的列表進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM