【问题标题】:Rearrange string in Python according to whole number first, then increasing values of groups [duplicate]首先根据整数重新排列Python中的字符串,然后增加组的值[重复]
【发布时间】:2016-07-19 02:51:54
【问题描述】:

例如,考虑字符串'3a+1+4c+3b'。然后,使用一些正则表达式,将其拆分为['3a','1','4c','3b']我如何重新排列该列表,以便对其进行排序,以便将后面没有字母的数字放在列表中的第一位,然后将其余元素按数字/字母组合的递增值排序? 例如,['3a','1','4c','3b'] 变为 ['1','3a','3b','4c']

编辑:

所以,澄清一下,我确实使用了sorted,但如果我使用它,例如,在2k+1-6j+9i 上,它会变成['1', '2k', '6j', '9i'],你可以看到它不是按字母递增的顺序排序的价值。我希望它改为['1','9i','6j','3k']

【问题讨论】:

  • 只是 sorted 适用于您的示例。你能举个更好的例子吗?
  • natsorted(s.split('+')) 使用 natsort 包。
  • @zondo 将中断大于 9 的整数
  • 我猜这个问题的目的是让['3a','5','4c','2b'] 排序为['5','3a','2b','4c']。即按字母后缀排序,而不是按整数值排序。
  • @SebastianPaaskeTørholm 是的,你是对的。

标签: python regex string list sorting


【解决方案1】:

使用返回 tuple 的键对其进行排序,其中包含第一优先级 - 元素是否不是全数字 - 后跟第二优先级 - 元素中的字母 - 后跟可能的第三优先级 - 整数值元素中的数字。

def sorter(l):
    return sorted(l, key=lambda x: (not x.isdigit(),
                                    ''.join(filter(str.isalpha, x)),
                                    int(''.join(filter(str.isdigit, x)))))

结果:

>>> sorter(['3a','1','4c','3b'])
['1', '3a', '3b', '4c']
>>> sorter(['1231212', '1a'])
['1231212', '1a']
>>> sorter(['13a', '3a'])
['3a', '13a']

【讨论】:

    【解决方案2】:

    您可以使用sorted() 的密钥:

    >>> sorted(['3a','5','4c','2b'], key=lambda x: (not x.isdigit(), x[::-1]))
    ['5', '3a', '2b', '4c']
    

    但请注意,如果您的字符串长度超过两个字符,它可能无法按照您的预期工作。你可以这样做:

    sorted([...], key=lambda x: (not x.isdigit(), x[-1], int(x[:-1]) if x[:-1] else int(x)))
    

    【讨论】:

    • (len(x),x[::-1])lambda 函数中实际上做了什么?
    • @R.Kap:我稍微改变了它,但它返回一个字符串是否为数字的元组以及字符串的反转。如果字符串是数字,则元组将为(0, reversed_string),但如果不是,则为(1, reversed_string)。由于具有较低值的元组首先出现,因此只是一个数字的字符串将在一个不是的字符串之前出现。使用反转的字符串作为第二个参数会使最后一个字符(即字母)比其他字符更重要。
    猜你喜欢
    • 2020-09-14
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2012-07-25
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多