【问题标题】:Numerically sort comma separated strings of numbers对逗号分隔的数字字符串进行数字排序
【发布时间】:2017-07-17 06:04:51
【问题描述】:

希望按列对一组 .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']

首先,按第一列排序,然后按第二列,依此类推。

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

【问题讨论】:

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

标签: python sorting


【解决方案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']

完全公开,我是包的作者。

【讨论】:

【解决方案2】:

使用sorted的key参数可以更优雅地完成:

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']

通过上面的代码,我们将列表中的每个字符串转换为整数值列表,并将这个整数值列表用作排序键

【讨论】:

  • 是的,在 Python 3 中显然 sorted(data, key=lambda s : list(map(int, s.split(',')))) 是必需的。如果数据是数据框中的一列,有什么方法可以做到这一点?
猜你喜欢
  • 2020-03-14
  • 1970-01-01
  • 2021-12-06
  • 2022-11-03
  • 2016-01-18
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多