![](/img/trans.png)
[英]How can I sort a list based on a float inside each string in Python?
[英]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'
因為1
在9
之前。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.