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)
由于每个预期序列都包含当时常用幂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)
归档时间: |
|
查看次数: |
1787 次 |
最近记录: |