长度方向的排序名单,但按字母顺序相同的长度,在步骤(Length-wise-sorted list

2019-07-17 17:58发布

我的Python字符串列表是像x ,但足够长的时间:

x = ['aaa','ab','aa','c','a','b','ba']      

我想对此列表进行排序为['a', 'b', 'c', 'aa', 'ab', 'ba', 'aaa']和我一样在两个步骤如下:

>>> x.sort()   
>>> x.sort(key=len)      
>>> x
['a', 'b', 'c', 'aa', 'ab', 'ba', 'aaa']   

但我需要在一个步:我还用绑lambda函数( 取帮助 ):

>>> x.sort(key=lambda item: (item, len(item)))
>>> x
['a', 'aa', 'aaa', 'ab', 'b', 'ba', 'c']  

但并不像我所希望的:

是否有可能在一个步骤? 让我开心。

我的Python:

~$ python --version  
Python 2.6.6

Answer 1:

你得到的元组的顺序以错误的方式。 当Python排序上的元组,第一个值是主要的排序,与第二个是subsort,等等-你的代码中假设相反的顺序。

你想通过长度进行排序, 然后按字母顺序排列:

>>> x.sort(key=lambda item: (len(item), item))
>>> x
['a', 'b', 'c', 'aa', 'ab', 'ba', 'aaa']

编辑:DSM在评论中指出,Python的排序字母大写,然后再小写。 如果这种行为是不想要,看到这个答案 。



Answer 2:

使用itertools.grouby()

In [29]: lis = ['aaa','ab','aa','c','a','b','ba']
In [30]: list(chain(*[sorted(g) for k,g in groupby(sorted(lis,key=len),key=len)]))
Out[30]: ['a', 'b', 'c', 'aa', 'ab', 'ba', 'aaa']

timeit比较:

In [38]: x = ['aaa','ab','aa','c','a','b','ba']*1000

In [39]: random.shuffle(x)

#may be in more tricky test cases this would be fast

In [40]: %timeit sorted(x,key=lambda item: (len(item), item))
100 loops, best of 3: 11.3 ms per loop

In [41]: %timeit list(chain(*[sorted(g) for k,g in groupby(sorted(x,key=len),key=len)]))
100 loops, best of 3: 7.82 ms per loop


文章来源: Length-wise-sorted list but, same length in alphabetical-order in a step