2012-11-20 104 views
0

我想使用python對字符串數組進行排序。python字符串數組排序

我有一個字符串數組

str_array = {string1, string2, string3} 
all string formats are AB-CD-EFGH-IJ-NAME ------> 12-34-5678-09-PHOTO 

AB= 00 to 99 
CD= 00 to 99 
EFGH= 0000 to 9999 
IJ= 00 to 99 
NAME= any alphabetic name 

我想的排序字符串先用有等效的數值(除去「 - 」從字符串的數字部分),然後按字母順序排列。

例如12-34-5678-09-PHOTO將是1234568809-PHOTO。

+1

這不是Python語法 – inspectorG4dget

+0

是真的不應該太大的差別進行排序。你究竟想要做什麼?你應該告訴我們你有什麼問題,以及你的問題在哪裏。 – mata

回答

0

定義按鍵功能,這需要可迭代str_array作爲輸入的元素,並返回一個元組關鍵consis整數(第一)和名稱(第二)的廷:

def mykey(text): 
    numtxt, name = text.rsplit('-',1) 
    numtxt = int(numtxt.replace('-','')) 
    return (numtxt, name) 

new_str = sorted(str_array, key = mykey) 

例如,

In [30]: sorted(['12-34-5678-09-PHOTO', '12-34-5678-09-MOTOR', '12-04-5678-09-PHOTO', ], key = mykey) 
Out[30]: ['12-04-5678-09-PHOTO', '12-34-5678-09-MOTOR', '12-34-5678-09-PHOTO'] 

有關這方面的排序技術,請參見HOWTO Sort wiki


請注意,sorted返回一個新的列表。如果要排序就地str_array,然後用

str_array.sort(key = mykey) 
+0

我使用下面的代碼 –

0

呃,這個排序怎麼樣?

無論如何。

"".join(yourstring.split('-')) 

是刪除破折號的規範方法。您可以通過指定最大分割數來保留最後一個分割。

"".join(test.split('-', 3)) 

如果你想用字母部分進行排序,它不會直觀地工作,除非你使用商店只是字母部分中一個數組和排序是關鍵:

temp = test.split('-') 
numbers, alpha = "".join(temp[:-1]), temp[-1] 
+0

不一定是元組。 'sort'可以採用任何'key'或者'cmp' – inspectorG4dget

+0

@ inspectorG4dget我喜歡你的解決方案,但是把它放在一個元組中,並且使用字符串格式來打印感覺就像是阻力最小的路徑 - 數據的格式不是'我喜歡被排序,因此尤里卡,我會做一個自定義的排序功能,似乎它只是使事情複雜化。 – kreativitea

+0

我同意改變數據結構將是完成這個任務的理想方式。但如果這是更大程序的一部分,那可能不是一種選擇。另外,在'str.split'中查找可選的'maxsplit'參數。 – inspectorG4dget

1

我不牛逼完全明白你的問題,但看看這有助於:

def myCmp(s1, s2): 
    s1 = s1.replace('-', '', 3) 
    s2 = s2.replace('-', '', 3) 
    int1, _, name1 = s1.partition('-')[0] 
    int2, _, name2 = s2.partition('-')[0] 
    if int1 < int2: 
     return -1 
    elif int1 > int2: 
     return 1 
    elif name1 < name2: 
     return -1 
    elif name1 > name 2: 
     return 1 
    else: 
     return 0 

str_array.sort(cmp=myCmp)