2016-12-30 49 views
1

我想對包含變量類的numpy數組進行排序。Python對數組進行排序

groups =['(0, 10]', '(10, 20]', '(100, 110]', '(110, 120]', '(120, 130]', 
     '(130, 140]', '(140, 150]', '(150, 160]', '(160, 170]', '(170, 180]', 
     '(180, 190]', '(190, 200]', '(20, 30]', '(200, 210]', '(210, 220]', 
     '(230, 240]', '(30, 40]', '(40, 50]', '(50, 60]', '(60, 70]', 
     '(70, 80]', '(80, 90]', '(90, 100]'] 

我想這一點:

groups = ['(0, 10]', '(10, 20]','(30, 40]','(40, 50]', '(50, 60]', ...] 

我嘗試這樣做:

sort(groups) 

但沒有........

+1

NameError:名稱 '排序' 沒有被定義 –

+0

是這樣的陣列生成使用'pandas.cut'? –

+0

是的,我使用pandas.cut – dimitrisGmk

回答

3

排序功能是sorted。我們將使用一個關鍵函數來提取數字並將它們轉換爲整數的元組。

sorted(groups, key=lambda x: tuple(map(int, x[1:-1].split(',')))) 

輸出:

['(0, 10]', '(10, 20]', '(20, 30]', '(30, 40]', '(40, 50]', '(50, 60]', 
'(60, 70]', '(70, 80]', '(80, 90]', '(90, 100]', '(100, 110]', '(110, 120]', 
'(120, 130]', '(130, 140]', '(140, 150]', '(150, 160]', '(160, 170]', 
'(170, 180]', '(180, 190]', '(190, 200]', '(200, 210]', '(210, 220]', '(230, 240]'] 
+0

它不工作...我想找到一種方法而不會失去類的形成 – dimitrisGmk

+1

@dimitrisGmk你的意思是「類」的類形成什麼?關鍵函數將它們排序爲它們是元組,但實際上並未更改這些值。 'sorted'創建一個新列表,並且不修改舊列表。 –

-3

有兩個問題與你的元素

  • 他們是字符串,而不是數字的元組
  • 關閉]不匹配開口(

所以,你首先必須將它們轉換

groups = [eval(group[:-1] + ')') for group in groups] 
print(sorted(groups)) 
+2

請避免使用'eval'。 –

+0

我知道了,但是在這種情況下想不到更好的辦法 –

+1

'ast.literal_eval'更安全 –

1

你必須解釋你的字符串作爲元組數字否則會被字典順序進行排序(這會給出錯誤的結果!):

def interpret_as_tuple(x): 
    splitted = x.split(',') 
    first = int(splitted[0].strip('(')) 
    second = int(splitted[1].strip('] ')) 
    return first, second 

groups.sort(key=interpret_as_tuple) 

groups 

回報:

['(0, 10]', '(10, 20]', '(20, 30]', '(30, 40]', '(40, 50]', '(50, 60]', '(60, 70]', 
'(70, 80]', '(80, 90]', '(90, 100]', '(100, 110]', '(110, 120]', '(120, 130]', 
'(130, 140]', '(140, 150]', '(150, 160]', '(160, 170]', '(170, 180]', '(180, 190]', 
'(190, 200]', '(200, 210]', '(210, 220]', '(230, 240]']