我有列表列表,我希望按字母顺序按4索引对列表进行排序,但有些情况下它将为none或为空,因此这些情况需要位于底部。
进一步澄清 - 它应该按AaBbCc排序然后是无或如果没有则为空。我只是希望第一个项目按顺序排列,不区分大小写。
from operator import itemgetter
list_of_list = [[0,1,2,3,'Ab'],[0,1,2,3,'bA'],[0,1,2,3,' '],[0,1,2,3,'None'], [0,1,2,3,''],[0,1,2,3,'Ca'] ]
list_of_list = sorted(list_of_list, key=itemgetter(4))
print list_of_list
Output: [[0, 1, 2, 3, ''], [0, 1, 2, 3, ' '], [0, 1, 2, 3, 'Ab'], [0, 1, 2, 3, 'Ca'], [0, 1, 2, 3, 'None'], [0, 1, 2, 3, 'bA']]
应该这样输出:
[[0, 1, 2, 3, 'Ab'], [0, 1, 2, 3, 'bA'],[0, 1, 2, 3, 'Ca'], [0, 1, 2, 3, 'None'], [0, 1, 2, 3, ''], [0, 1, 2, 3, ' ']]
答案 0 :(得分:1)
你可以试试这个:
>>> list_of_list = [[0, 1, 2, 3, 'Ab'],
[0, 1, 2, 3, 'bA'],
[0, 1, 2, 3, ' '],
[0, 1, 2, 3, None],
[0, 1, 2, 3, ''],
[0, 1, 2, 3, 'Ca']]
>>> list_of_list = sorted(list_of_list,
key=lambda x: x[4] if isinstance(x[4], basestring) else "",
reverse=True)
>>> print list_of_list
[[0, 1, 2, 3, 'bA'], [0, 1, 2, 3, 'Ca'], [0, 1, 2, 3, 'Ab'], [0, 1, 2, 3, ' '], [0, 1, 2, 3, None], [0, 1, 2, 3, '']]
这样做是使用第四个元素作为排序键,如果它是一个字符串,否则它将使用空字符串作为比较键。
或者,您可以将列表拆分为两个列表,仅对第一个列表进行排序,并将其余元素添加如下:
list_of_list = sorted(x
for x in list_of_list
if isinstance(x[4], basestring) and len(x[4].strip())) + \
[x
for x in list_of_list
if not isinstance(x[4], basestring) or not len(x[4].strip())]
print list_of_list
产量
[[0, 1, 2, 3, 'Ab'], [0, 1, 2, 3, 'Ca'], [0, 1, 2, 3, 'bA'], [0, 1, 2, 3, ' '], [0, 1, 2, 3, None], [0, 1, 2, 3, '']]
目前还不完全清楚是否需要遵循其他排序标准,而且这个解决方案并不完全漂亮,但至少它会对前面的字符串进行排序并将其余部分保留在后面。