對不起,用英語告訴我這個很復雜。這是我的問題。我有這個清單:
s=["2.11", "4.7.0", "1.3", "2.2", "0.1", "1.2.5", "1.3.1", "2.7"]
我希望這些數字從小到大排序。但不是數學上的,不完全是。對于版本號概念。
將它們視為版本號。不是普通的數學。對于普通數學,2.2>2.11 但對于程式版本號概念,它是 2.11>2.2 所以我需要以某種方式對它們進行排序。我想到的第一件事就是這個。也許從那里得到那些從點分割出來的 11、7、3、2 個數字。然后比較它們,問題是如何把它們弄出來?我嘗試了 stackoverflow 的各種解決方案。例如 2.11 的 11 是這樣的:
print(s[0][2:len(s[0])]) # prints 11
由于此串列實際上是像您一樣的二維陣列,因此許多解決方案對我不起作用。請幫忙。或者我錯過了什么?有沒有更簡單的方法來做到這一點?
預期輸出如下。認為這是從函式回傳的:
0.1,1.2.5,1.3,1.3.1,2.2,2.7,2.11,4.7
uj5u.com熱心網友回復:
用:
s=["2.11", "4.7.0", "1.3", "2.2", "0.1", "1.2.5", "1.3.1", "2.7"]
res = sorted(s, key=lambda x: tuple(map(int, x.split("."))))
print(res)
輸出
['0.1', '1.2.5', '1.3', '1.3.1', '2.2', '2.7', '2.11', '4.7.0']
這個想法是使用sorted檔案中的,的關鍵引數來比較字串(重點是我的):
key指定一個帶一個引數的函式,用于從 iterable 中的每個元素中提取比較鍵(例如,key=str.lower)。默認值為 None (直接比較元素)。
在這種情況下,key 引數將字串拆分"."為一個整數,并將每個子字串轉換為一個整數,例如:
"0.1" -> (0, 1)
"2.2" -> (2, 2)
"2.11" -> (2, 11)
作為替代用途:
res = sorted(s, key=lambda x: [int(xi) for xi in x.split(".")])
在這里你可以找到更多關于關鍵引數的想法sorted(如何在 Python 中比較版本號)。如果版本符合 PEP440,您可以使用packaging.version.parse:
from packaging.version import parse
s = ["2.11", "4.7.0", "1.3", "2.2", "0.1", "1.2.5", "1.3.1", "2.7"]
res = sorted(s, key=parse)
print(res)
輸出
['0.1', '1.2.5', '1.3', '1.3.1', '2.2', '2.7', '2.11', '4.7.0']
uj5u.com熱心網友回復:
所以這,應該作業
# as version numbers, so 2.7.2 is less than 2.7.11 for example.
s = ["2.11", "4.7.0", "1.3", "2.2", "0.1", "1.2.5", "1.3.1", "2.7"]
# sort the list of versions numbers
s.sort(key=lambda x: list(map(int, x.split('.'))))
print(s)
從 python>=3.8 開始,我認為這會map回傳一個迭代器,因此我們需要手動將其轉換為串列
uj5u.com熱心網友回復:
一種使用distutils.version.LooseVersion.
如果它們像 version,讓它們作為版本處理。
from distutils.version import LooseVersion
sorted(s, key=LooseVersion)
輸出:
['0.1', '1.2.5', '1.3', '1.3.1', '2.2', '2.7', '2.11', '4.7.0']
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/346637.html
