我的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
你得到的元组的顺序以错误的方式。 当Python排序上的元组,第一个值是主要的排序,与第二个是subsort,等等-你的代码中假设相反的顺序。
你想通过长度进行排序, 然后按字母顺序排列:
>>> x.sort(key=lambda item: (len(item), item))
>>> x
['a', 'b', 'c', 'aa', 'ab', 'ba', 'aaa']
编辑:DSM在评论中指出,Python的排序字母大写,然后再小写。 如果这种行为是不想要,看到这个答案 。
使用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