按长度排序的列表,但在步骤中按字母顺序排列相同的长度

时间:2012-12-31 16:00:00

标签: python python-2.6

我的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函数(taken help)绑定:

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

但不是我想要的:

一步到位可以吗?让我开心。

我的Python:

~$ python --version  
Python 2.6.6

2 个答案:

答案 0 :(得分:9)

你以错误的方式得到了元组的顺序。当Python对元组进行排序时,第一个值是 main 排序,第二个值是子句等等...... - 您的代码假设顺序相反。

您想要按长度排序,然后按字母顺序排序:

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

编辑:正如DSM在评论中指出的那样,Python首先将字母排序为大写,然后小写。如果不需要此行为,请参阅this answer

答案 1 :(得分:1)

使用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