【问题标题】:Python sorting non logic string [duplicate]Python排序非逻辑字符串[重复]
【发布时间】:2014-12-19 13:17:55
【问题描述】:

MS Word 有这种默认的非逻辑编号方式,我相信它已经在许多其他地方体现出来。我说的是

...

1.8.1 忍者

1.8.2 加布

1.9.1 Foo

1.10.1 咩

...

但是使用字符串并希望排序会给出以下顺序:

[1.10.1 Baa, 1.8.1 Ninja, 1.8.2 Gaab, 1.9.1 Foo]

有没有简单漂亮的python方法解决这个问题?

【问题讨论】:

标签: python sorting


【解决方案1】:

您需要lambda 和从节编号获得的三个键,即从拆分节编号获得的三个整数:

>>> lst = ['1.10.1 Baa', '1.8.1 Ninja', '1.8.2 Gaab', '1.9.1 Foo']
>>> sorted(lst, key=lambda x:([int(x) for x in x.split()[0].split('.')]))
['1.8.1 Ninja', '1.8.2 Gaab', '1.9.1 Foo', '1.10.1 Baa']

【讨论】:

    【解决方案2】:
    sorted(section_names, key=lambda x: tuple(map(int, x.partition(" ")[0].split("."))))
    

    【讨论】:

      【解决方案3】:

      利用元组按您想要的顺序排序的事实:

      strList = ["1.8.1 Ninja",                                                        
        "1.8.2 Gaab",
        "1.9.1 Foo",
        "1.10.1 Baa"]
      
      sorted(( (tuple(map(int, x.split('.'))), y)   # Sort according to list numbers
                for s in strList 
                for [x, y] in [s.split(' ', 1)]     # [x, y] = s.split(' ', 1)
                                                    # Splits list in exactly 2 elems
            ))
      
      # Out[43]:
      # [((1, 8, 1), 'Ninja'),
      # ((1, 8, 2), 'Gaab'),
      # ((1, 9, 1), 'Foo'),
      # ((1, 10, 1), 'Baa')]
      

      【讨论】:

      • 看看 Bhat 和我的答案,您可以利用这个事实,而无需更改 list 的元素,方法是使用 key 参数 sorted
      猜你喜欢
      • 2020-08-24
      • 2016-02-11
      • 2012-07-11
      • 2019-03-05
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      • 1970-01-01
      相关资源
      最近更新 更多