簡體   English   中英

如何根據其中的字符對字符串列表進行排序?

[英]How can I sort a list of String based on character inside of them?

我有一個看起來像這樣的字符串列表:

['training_tech26.txt', 'training_tech41.txt', 'training_tech68.txt', 'training_tech84.txt', 'training_tech52.txt', 'training_sales17.txt', 'training_sales2.txt', 'training_tech47.txt', 'training_sales23.txt', 'training_sales3.txt', 'training_tech9.txt', 'training_tech12.txt']

我需要按正確的順序對這些文件進行排序,例如:

['training_tech1.txt', 'training_tech2.txt', 'training_sales3.txt', 'training_tech4.txt', 'training_tech5.txt']

我正在使用這些代碼來訪問我的文件夾中的所有文件,並將它們 append 放入一個列表中。 在文件夾本身中,它們的順序是正確的,所以我不知道為什么這個列表會亂七八糟。

tech_dir_path = "/path/to/folder/with/files"
res = []
tech_res = os.listdir(tech_dir_path)

有 python 用於字符串自然排序的第三方庫,稱為natsort

from natsort import natsorted
tech_res = ['training_tech26.txt', 'training_tech41.txt', 'training_tech68.txt', 'training_tech84.txt', 'training_tech52.txt', 'training_sales17.txt', 'training_sales2.txt', 'training_tech47.txt', 'training_sales23.txt', 'training_sales3.txt', 'training_tech9.txt', 'training_tech12.txt']

print(natsorted(tech_res, key=lambda y: y.lower()))

Output:

['training_sales2.txt', 'training_sales3.txt', 'training_sales17.txt', 'training_sales23.txt', 'training_tech9.txt', 'training_tech12.txt', 'training_tech26.txt', 'training_tech41.txt', 'training_tech47.txt', 'training_tech52.txt', 'training_tech68.txt', 'training_tech84.txt']

查看您的示例輸入,這是我的代碼:

input = ['training_tech26.txt', 'training_tech41.txt', 'training_tech68.txt', 'training_tech84.txt', 'training_tech52.txt', 'training_sales17.txt', 'training_sales2.txt', 'training_tech47.txt', 'training_sales23.txt', 'training_sales3.txt', 'training_tech9.txt', 'training_tech12.txt']

def sorter(input):
    idx = [int(''.join([j for j in i if j.isdigit()])) for i in input] # gets the numbers in int
    idx.sort() # sort numbers
    res = []
    for i in idx: # iterate over idx
        for j in input: # iterate over input
            if i == int(''.join([k for k in j if k.isdigit()])): # checks if i is same as the j input
                res.append(j)
    return res
print(sorter(input))

您還可以在這里查看更多方法。

您可以使用key參數進行sort以提取文件擴展名前面的數字。

import re

# TODO handle the possibility of a failed match
def get_number(s):
    n = re.search(r'(\d+).txt', s).group(1)
    return int(n)

然后,例如,

>>> files = ['training_tech26.txt', 'training_tech41.txt', 'training_tech68.txt', 'training_tech84.txt', 'training_tech52.txt', 'training_sales17.txt', 'training_sales2.txt', 'training_tech47.txt', 'training_sales23.txt', 'training_sales3.txt', 'training_tech9.txt', 'training_tech12.txt']

>>> for f in sorted(files, key=get_number):
...  print(f)
...
training_sales2.txt
training_sales3.txt
training_tech9.txt
training_tech12.txt
training_sales17.txt
training_sales23.txt
training_tech26.txt
training_tech41.txt
training_tech47.txt
training_tech52.txt
training_tech68.txt
training_tech84.txt

os.listdir返回一個按字母順序排序的列表,在這種情況下'12' < '9'因為19之前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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