【问题标题】:Python - sort strings / numericPython - 排序字符串/数字
【发布时间】:2021-04-06 14:56:57
【问题描述】:

我的问题,我想对下面的列表进行排序(使用 Python)

my_list = ['2', '1', '1+', '1-', '2+', '2-']

进入

my_list = ['1+', '1', '1-', '2+', '2', '2-']

编辑:

我尝试了sorted,它给了我['1', '1+', '1-', '2', '2+', '2-']

因此,'1'和'1+'的顺序应该改变,或者'2+'和'2'等所有其他数字的顺序。

【问题讨论】:

  • 您尝试了什么但没有成功?我猜你已经找到了sortedlist.sort?换句话说:你能更具体地说明你在哪个部分苦苦挣扎吗?
  • 我试过sorted,它给了我['1', '1+', '1-', '2', '2+', '2-'],因此,'1'和'1+'的顺序应该改变,或者'2+'和'2'等所有其他数字也是如此
  • 请将其添加到您的问题文本中。另外:仍然不清楚这种排序顺序背后的 general 规则应该是什么,因为它似乎很随意?这个排序规则应该如何处理多位数字('1234+', '1234', '1234-')?到目前为止的例子看起来很随机
  • 规则是:任何以“+”结尾的数字,然后是任何不带附加字符的数字,然后是任何以“-”结尾的数字。

标签: python python-3.x list sorting


【解决方案1】:

任意规则需要任意消耗性解决方案:我依赖于元组按元素排序的事实,因此数字012 用作优先级:

def plus_before_minus(item):
    number = item.rstrip('+-')
    if item.endswith('+'):
        return (number, 0)
    elif item.endswith('-'):
        return (number, 2)
    else:
        return (number, 1)

这样,列表将按要求排序:

>>> sorted(my_list, key=plus_before_minus)
['1+', '1', '1-', '2+', '2', '2-']

【讨论】:

  • 也可以使用number = item.rstrip("+-") :)
  • @swenzel:是的,谢谢,我的头在哪里?
【解决方案2】:

在这里,我首先创建一个函数get_priority 来返回每个元素的优先级。这个返回的数字稍后将用于排序。

def get_priority(x):
    return {
        '+': 1,
        '-': 3
    }.get(x, 2)

# If returned number:
#     ends with '-': return 3 (Highest / First)
#     ends with '+': return 1 (Lowest / Last)
#     else: return 2 (Medium / Middle)

然后在这里我将使用get_priority 函数以及itertools.groupby()operator.itemgetter()sorted() 来实现您想要的顺序:

from itertools import groupby
from operator import itemgetter

my_list = ['2', '1', '1+', '1-', '2+', '2-']

new_list = [i for _, l in groupby(sorted(my_list), key=itemgetter(0)) for i in sorted(l, key= lambda x: get_priority(x[-1]))]

new_list 将返回值:

['1+', '1', '1-', '2+', '2', '2-']

【讨论】:

    猜你喜欢
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 2014-07-14
    • 2023-02-06
    • 2021-01-25
    • 1970-01-01
    相关资源
    最近更新 更多