2016-12-30 165 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]']