2011-05-19 78 views
4

UPDATE:我應該早點指定它,但不是所有的名字都只是浮動的。例如,其中一些「前綴」與「YT」。因此,例如「YT1.1。所以,你有同樣的問題YT1.9 < YT1.11應該是真的。我真的很驚訝,字符串比較失敗....比較兩個包含數字的python字符串

你好, 這應該是一個非常簡單的問題,但我似乎無法找到答案,我想按名稱對一堆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?

回答

9

轉換的名稱爲整數的元組和比較的元組:

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'] 
+0

很好的回答。簡單而有效。 – dkamins 2011-05-19 18:16:12

+0

不必轉換爲int甚至。 – marr75 2011-05-19 18:31:31

-2

如果你知道他們是實數[*],簡單地說:

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

[*]否則,隨時準備處理提出ValueError

+4

不正確。 4.11浮點數<4.2,但後來應該(11> 2)。 – dkamins 2011-05-19 18:12:28

+0

這假設這些數字是有效的浮點數。 – Falmarri 2011-05-19 18:12:43

+1

不,這裏假設OP已經提出了一個不同的問題。有效的花車是一個好的假設。 – marr75 2011-05-19 18:34:34

1

這不是一個內置的方法,但它應該工作:

>>> 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 

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

1

你在找什麼叫做「自然排序」。這與「詞典排序」相反。有幾個配方可以做到這一點,因爲你想要的具體輸出是實現特定的。快速谷歌搜索得到這個(注*這不是我的代碼,我也沒有測試過它):

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

0

使用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()