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

pyt*_*hon 10 python sorting list

假设

A = [9, 5, 34, 33, 32, 31, 300, 30, 3, 256]
Run Code Online (Sandbox Code Playgroud)

我想只对列表中的特定部分进行排序.例如,在这里我只想排序,[300, 30, 3]以便整个列表变为:

A = [9, 5, 34, 33, 32, 31, 3, 30, 300, 256]
Run Code Online (Sandbox Code Playgroud)

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

主要想法if the leftmost digit is same 300, 30, 30和最正确的数字只包含zeros然后我们应该按递增顺序排列它.

另一个例子:

A = [100, 10, 1, 2000, 20, 2]
Run Code Online (Sandbox Code Playgroud)

排序后应该是 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]
Run Code Online (Sandbox Code Playgroud)

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

这是一个很好的例子:

A = [9, 5, 100, 10, 30, 3, 265, 200, 20, 2]
Run Code Online (Sandbox Code Playgroud)

排序后应该是:

A = [9, 5, 10, 100, 3, 30, 265, 2, 20, 200]
Run Code Online (Sandbox Code Playgroud)

Kas*_*mvd 7

由于每个预期序列都包含当时常用幂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]
Run Code Online (Sandbox Code Playgroud)

请注意,由于我们根据当时的幂函数对数字进行分类,如果子列表的长度大于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]
Run Code Online (Sandbox Code Playgroud)