假设
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/