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函数绑定(采取了帮助):

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

但不是我想要的:

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

我的蟒蛇:

~$ python --version  
Python 2.6.6
4

2 回答 2

9

你得到了元组的顺序错误的方式。当 Python 对元组进行排序时,第一个值是排序,第二个是子排序,依此类推...... - 您的代码假定相反的顺序。

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

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

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

于 2012-12-31T16:01:07.470 回答
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
于 2012-12-31T16:19:11.380 回答