python - 如何在 Python 中仅对列表中的几个值进行排序

标签 python list sorting

假设

A = [9, 5, 34, 33, 32, 31, 300, 30, 3, 256]

我只想对列表中的特定部分进行排序。例如,这里我只想对 [300, 30, 3] 进行排序,这样整个列表就变成了:

A = [9, 5, 34, 33, 32, 31, 3, 30, 300, 256]

假设 B = [300, 30, 400, 40, 500, 50, 600, 60] 那么在排序后它应该是 B = [30, 300, 40, 400, 50, 500, 60, 600]

主要思想如果最左边的数字是相同的 300, 30, 30 而最右边的数字只包含 0 那么我们应该按升序排列它。

另一个例子:

A = [100, 10, 1, 2000, 20, 2]

排序后应该是A = [1, 10, 100, 2, 20, 2000]

任何人都可以建议一些技术来解决此类问题。我列表中的值将始终以这种方式排列 [200, 20, 2, 300, 30, 3, 400, 40, 4]

代码:

nums = [3, 30, 31, 32, 33, 34, 300, 256, 5, 9]
nums = sorted(nums, key=lambda x: str(x), reverse=True)
print nums
>> [9, 5, 34, 33, 32, 31, 300, 30, 3, 256]

但我的最终输出应该是 [9, 5, 34, 33, 32, 31, 3, 30, 300 256]

举个例子:

A = [9, 5, 100, 10, 30, 3, 265, 200, 20, 2]

排序后应该是:

A = [9, 5, 10, 100, 3, 30, 265, 2, 20, 200]

最佳答案

由于每个预期序列都包含作为 then 的公共(public)系数的数字,您可以使用返回公共(public)系数的 scientific_notation 函数。然后您可以根据此函数对您的数字进行分类并将它们连接起来。

>>> from operator import itemgetter
>>> from itertools import chain,groupby

>>> def scientific_notation(number):
...     while number%10 == 0:
...         number = number/10
...     return number

>>> A = [9, 5, 34, 33, 32, 31, 300, 30, 3, 256]
>>> G=[list(g) for _,g in groupby(A,key=scientific_notation)] 
>>> list(chain.from_iterable(sorted(sub) if len(sub)>1 else sub for sub in G))
[9, 5, 34, 33, 32, 31, 3, 30, 300, 256]

请注意,由于我们是根据幂的系数对数字进行分类,因此如果子列表的长度大于 1,则意味着它是一个需要排序的预期数字序列。因此,而不是检查长度对于每个序列,您可以简单地将排序应用于分组依据中的所有生成器:

>>> list(chain.from_iterable(sorted(g) for _,g in groupby(A,key=scientific_notation)))
[9, 5, 34, 33, 32, 31, 3, 30, 300, 256]

关于python - 如何在 Python 中仅对列表中的几个值进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33822603/

相关文章:

python - 使用 find 方法查找完全匹配

c# - 空引用异常 C# get set

algorithm - 奇怪排序的递归关系

c++ - 根据特定字段对结构 vector 进行排序

php - 在 PHP 和 MySQL 中对小列表(10 项)进行排序然后返回?

python - 以 f-String 格式列出\n

python - PyCharm:强制 Django 模板语法突出显示

python - 如果在python中发生错误,则处理异常

python - 基数排序, "Queue"对象不可迭代

Python 函数返回无序列表对象