我的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
答案 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