2015-06-13 27 views
-1

我是Python的新手,我很難解決這個問題。 我想排序一個列表,以便能夠人類排序它1)的第一個數字和2)第二個數字。我想有這樣的事情:用字符串中的兩個數字排序 - Python

'1-1bird' 
'1-1mouse' 
'1-1nmouses' 
'1-2mouse' 
'1-2nmouses' 
'1-3bird' 
'10-1birds' 
(...) 

這些數字可以從1到99例如:99-99bird是可能的。 這是我經歷了幾次頭痛後的代碼。能夠按照以下第一封信進行排序將是一項獎勵。
以下是我已經試過:

#!/usr/bin/python 


myList = list() 
myList = ['1-10bird', '1-10mouse', '1-10nmouses', '1-10person', '1-10cat', '1-11bird', '1-11mouse', '1-11nmouses', '1-11person', '1-11cat', '1-12bird', '1-12mouse', '1-12nmouses', '1-12person', '1-13mouse', '1-13nmouses', '1-13person', '1-14bird', '1-14mouse', '1-14nmouses', '1-14person', '1-14cat', '1-15cat', '1-1bird', '1-1mouse', '1-1nmouses', '1-1person', '1-1cat', '1-2bird', '1-2mouse', '1-2nmouses', '1-2person', '1-2cat', '1-3bird', '1-3mouse', '1-3nmouses', '1-3person', '1-3cat', '2-14cat', '2-15cat', '2-16cat', '2-1bird', '2-1mouse', '2-1nmouses', '2-1person', '2-1cat', '2-2bird', '2-2mouse', '2-2nmouses', '2-2person'] 


def mysort(x,y): 
x1="" 
y1="" 

for myletter in x : 
    if myletter.isdigit() or "-" in myletter: 
     x1=x1+myletter 

x1 = x1.split("-") 

for myletter in y : 
    if myletter.isdigit() or "-" in myletter: 
     y1=y1+myletter 

y1 = y1.split("-") 


if x1[0]>y1[0]: 
    return 1 
elif x1[0]==y1[0]: 
    if x1[1]>y1[1]: 
     return 1 
    elif x1==y1: 
     return 0 
    else : 
     return -1 
else : 
    return -1 




myList.sort(mysort) 
print myList 

謝謝!

馬丁

+0

是否通過,如果有人母鹿在Stackoverflow上爲你分配這個任務嗎? –

回答

0

你有分裂一些好的想法上'-'和使用isalpha()isdigit(),但隨後我們將使用這些來創建一個函數,它在一個項目和項目的返回一個「乾淨」版本,可以很容易地分類。它會創建第一個數字的三位數,零填充表示,然後與第二個數字相似,然後是「單詞」部分(而不是第一個字符)。結果看起來像"001001bird"(不會顯示 - 它只會在內部使用)。內置函數sorted()將使用此回調函數作爲關鍵字,將每個元素傳遞給回調函數,並將返回值的排序順序作爲基礎。在測試中,我使用*運算符和sep參數來打印它,而無需構建循環,但循環也非常好。

def callback(item): 
    phrase = item.split('-') 
    first = phrase[0].rjust(3, '0') 
    second = ''.join(filter(str.isdigit, phrase[1])).rjust(3, '0') 
    word = ''.join(filter(str.isalpha, phrase[1])) 
    return first + second + word 

測試:

>>> myList = ['1-10bird', '1-10mouse', '1-10nmouses', '1-10person', '1-10cat', '1-11bird', '1-11mouse', '1-11nmouses', '1-11person', '1-11cat', '1-12bird', '1-12mouse', '1-12nmouses', '1-12person', '1-13mouse', '1-13nmouses', '1-13person', '1-14bird', '1-14mouse', '1-14nmouses', '1-14person', '1-14cat', '1-15cat', '1-1bird', '1-1mouse', '1-1nmouses', '1-1person', '1-1cat', '1-2bird', '1-2mouse', '1-2nmouses', '1-2person', '1-2cat', '1-3bird', '1-3mouse', '1-3nmouses', '1-3person', '1-3cat', '2-14cat', '2-15cat', '2-16cat', '2-1bird', '2-1mouse', '2-1nmouses', '2-1person', '2-1cat', '2-2bird', '2-2mouse', '2-2nmouses', '2-2person'] 
>>> print(*sorted(myList, key=callback), sep='\n') 
1-1bird 
1-1cat 
1-1mouse 
1-1nmouses 
1-1person 
1-2bird 
1-2cat 
1-2mouse 
1-2nmouses 
1-2person 
1-3bird 
1-3cat 
1-3mouse 
1-3nmouses 
1-3person 
1-10bird 
1-10cat 
1-10mouse 
1-10nmouses 
1-10person 
1-11bird 
1-11cat 
1-11mouse 
1-11nmouses 
1-11person 
1-12bird 
1-12mouse 
1-12nmouses 
1-12person 
1-13mouse 
1-13nmouses 
1-13person 
1-14bird 
1-14cat 
1-14mouse 
1-14nmouses 
1-14person 
1-15cat 
2-1bird 
2-1cat 
2-1mouse 
2-1nmouses 
2-1person 
2-2bird 
2-2mouse 
2-2nmouses 
2-2person 
2-14cat 
2-15cat 
2-16cat 
0

你需要前導零。字符串按字母順序排列,順序與數字順序不同。它應該是

'01-1bird' 
'01-1mouse' 
'01-1nmouses' 
'01-2mouse' 
'01-2nmouses' 
'01-3bird' 
'10-1birds' 

正如你看到1變爲0後

0

這裏其他的答案是非常可觀的,我敢肯定,但完全的信用,你應該確保你的答案適合於單一線,並使用盡可能多的列表理解爲可能:

import itertools 
[''.join(r) for r in sorted([[''.join(x) for _, x in 
      itertools.groupby(v, key=str.isdigit)] 
      for v in myList], key=lambda v: (int(v[0]), int(v[2]), v[3]))] 

那應該很好地做到:

['1-1bird', 
'1-1cat', 
'1-1mouse', 
'1-1nmouses', 
'1-1person', 
'1-2bird', 
'1-2cat', 
'1-2mouse', 
... 
'2-2person', 
'2-14cat', 
'2-15cat', 
'2-16cat']