我知道按长度排序包含单词的列表。 这意味着一个清单:
[[],['hello','indent'],['hi','monday'],['hi','low']]
如果排序键为length且reverse为True,则返回结果:
[['hello','indent','joe'],['hi','monday'],['hi','low'],[]]
但我想要的是按长度排序,具有相同长度的那些必须按字母顺序排序。即'低'<'星期一'所以输出应该是:
[['hello','indent','joe'],['hi','low'],['hi','monday'],[]]
我必须使用哪种密钥才能使用内置排序进行排序?
编辑:但如果输入是混合的情况怎么办?如果是:
[['Hi', 'monday'], [], ['hello', 'indent', 'joe'], ['hi', 'low']]
,所需的输出将是:
[['hello', 'indent', 'joe'], ['hi', 'monday'],['Hi', 'low'], []]
答案 0 :(得分:1)
首先按字母顺序排序,然后按相反顺序排序。
>>> lst = [['hi', 'monday'], [], ['hello', 'indent', 'joe'], ['hi', 'low']]
>>> lst.sort()
>>> lst.sort(key=len, reverse=True)
>>> print lst
>>> [['hello', 'indent', 'joe'], ['hi', 'low'], ['hi', 'monday'], []]
结果集中的项目顺序高度取决于您当前的区域设置。如果您希望排序算法在排序项时考虑区域设置,则可以执行以下操作;
>>> import locale
>>> from functools import cmp_to_key
>>>
>>> # You can change your locale like below;
>>> # locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
>>>
>>> lst = [['hi', 'monday'], [], ['hello', 'indent', 'joe'], ['hi', 'low']]
>>> print sorted([sorted(item, key=cmp_to_key(locale.strcoll)) for item in lst], key=len, reverse=True)
>>> [['hello', 'indent', 'joe'], ['hi', 'monday'], ['hi', 'low'], []]
答案 1 :(得分:1)
这可以通过合适的键功能一次完成。
a = [['hi', 'monday'], [], ['hello', 'indent', 'joe'], ['hi', 'low']]
a.sort(key=lambda l:(-len(l), l))
print a
<强>输出强>
[['hello', 'indent', 'joe'], ['hi', 'low'], ['hi', 'monday'], []]
要将小写字母放在大写字母之前,我们可以在每个子列表中的字符串上使用str.swapcase()
方法:
a = [['Hi', 'monday'], [], ['hello', 'indent', 'joe'], ['hi', 'low']]
a.sort(key=lambda l:(-len(l), [s.swapcase() for s in l]))
print a
<强>输出强>
[['hello', 'indent', 'joe'], ['hi', 'low'], ['Hi', 'monday'], []]
如果您希望排序不区分大小写:
a = [['Hi', 'monday'], [], ['hello', 'indent', 'joe'], ['hi', 'low']]
a.sort(key=lambda l:(-len(l), [s.lower() for s in l]))
print a
<强>输出强>
[['hello', 'indent', 'joe'], ['hi', 'low'], ['Hi', 'monday'], []]