2017-02-26 33 views
2

想要按列方式对一组.csv数字值进行排序。或者,列数也会变化。例如使用Python:以数字方式分类逗号分隔的数字字符串

 print(sorted(['9,11', '70,10', '10,8,1','10,70'])) 

产生

 ['10,70', '10,8,1', '70,10', '9,11'] 

而期望的结果是

 ['9,11', '10,8,1', '10,70', '70,10'] 

首先,排序第一列中,然后通过第二等

显然这可以做到,但这可以做到优雅吗?

+0

首先,迭代一次,解析字符串并获得第一个数字作为它们的权重。创建一个类,比如'weight'和'value'。迭代时,用这个类创建新的变量,并用它们生成一个新的列表。然后根据它们的权重对这些对象进行排序,最后迭代一次并收集排序后的值。 – webmaster

回答

3

可以通过使用key说法sorted更优雅的完成:

data = [ 
    '9,11', 
    '70,10', 
    '10,8,1', 
    '10,70' 
] 

print sorted(data, key=lambda s: map(int, s.split(','))) 

结果:

['9,11', '10,8,1', '10,70', '70,10'] 

随着我们我们的列表中的每个字符串转换成整数的列表,上面的代码值,我们使用这个整数值列表作为我们的排序键

+0

是的,在Python 3中显然是有序的(data,key = lambda s:list(map(int,s.split(','))))是必需的。任何方式来做到这一点,如果数据是一个数据框中的列? –

1

如果您不介意第三方模块,您可以使用natsort,它提供功能natsorted,它被设计成为sorted的直接替代品。

>>>> import natsort 
>>> natsort.natsorted(['9,11', '70,10', '10,8,1','10,70']) 
['9,11', '10,8,1', '10,70', '70,10'] 

完全披露,我是包的作者。

+0

有用的包,谢谢,有没有办法将它与DataFrames一起使用? –

+0

@TnatsissaHCraeser http://stackoverflow.com/questions/29580978/naturally-sorting-pandas-dataframe – SethMMorton

+0

http://natsort.readthedocs.io/ – SethMMorton