簡體   English   中英

比較兩個包含數字的 python 字符串

[英]compare two python strings that contain numbers

更新:我應該早點指定這一點,但並非所有名稱都只是浮點數。 例如,其中一些“前綴”為“YT”。 所以例如“YT1.1。所以,你有同樣的問題 YT1.9 < YT1.11 應該是真的。我真的很驚訝字符串比較失敗......

你好,這應該是一個非常簡單的問題,但我似乎找不到答案。 我想按名稱對一堆 XL 工作表進行排序。 每個名稱都是數字,但與教科書“部分”的編號方式相同,這意味着第 4.11 節在 4.10 之后,這兩者都在 4.9 和 4.1 之后。 我認為簡單地將這些數字作為字符串進行比較就可以了,但我得到以下信息:

>>> s1 = '4.11'
>>> s2 = '4.2'
>>> s1> s2
False
>>> n1 = 4.11
>>> n2 = 4.2
>>> n1 > n2
False

如何比較這兩個值,使 4.11 大於 4.2?

將名稱轉換為整數元組並比較這些元組:

def splittedname(s):
    return tuple(int(x) for x in s.split('.'))

splittedname(s1) > splittedname(s2)

更新:由於您的姓名顯然可以包含數字以外的其他字符,您需要檢查ValueError並保留任何無法轉換為整數的值不變:

import re

def tryint(x):
    try:
        return int(x)
    except ValueError:
        return x

def splittedname(s):
    return tuple(tryint(x) for x in re.split('([0-9]+)', s))

要對名稱列表進行排序,請使用splittedname作為sorted的鍵函數:

>>> names = ['YT4.11', '4.3', 'YT4.2', '4.10', 'PT2.19', 'PT2.9']
>>> sorted(names, key=splittedname)
['4.3', '4.10', 'PT2.9', 'PT2.19', 'YT4.2', 'YT4.11']

這不是內置方法,但它應該可以工作:

>>> def lt(num1, num2):
...     for a, b in zip(num1.split('.'), num2.split('.')):
...         if int(a) < int(b):
...             return True
...         if int(a) > int(b):
...             return False
...     return False
... 
... lt('4.2', '4.11')
0: True

這可以清理,但它給你的要點。

您正在尋找的稱為“自然排序”。 這與“詞典排序”相反。 有幾種方法可以做到這一點,因為您想要的確切輸出是特定於實現的。 快速谷歌搜索產生這個(注意*這不是我的代碼,我也沒有測試過):

import re

def tryint(s):
    try:
        return int(s)
    except:
        return s

def alphanum_key(s):
    """ Turn a string into a list of string and number chunks.
        "z23a" -> ["z", 23, "a"]
    """
    return [ tryint(c) for c in re.split('([0-9]+)', s) ]

def sort_nicely(l):
    """ Sort the given list in the way that humans expect.
    """
    l.sort(key=alphanum_key)

http://nedbatchelder.com/blog/200712.html#e20071211T054956

使用s1.split(".")創建小數點前后項目的列表,然后對列表列表進行排序,例如:

import random
sheets = list([str(x), str(y)] for x in xrange(1, 5) for y in xrange(0,99))
print sheets
#sheets in order
random.shuffle(sheets)
print sheets
#sheets out of order
sheets.sort()
print sheets
#sheets back in order

所以,你的實現可能是:

#assume input sheets is a list of the worksheet names
sheets = list(x.split(".") for x in input_sheets)
sheets.sort()

如果您知道它們是實數 [*] ,只需:

>>> float(s1) > float(s2)
True

[*] 否則,准備好處理引發的ValueError

暫無
暫無

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

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