Python如何使用特定条件对列表进行排序

时间:2015-03-28 00:01:17

标签: list python-2.7 sorting

我有列表列表,我希望按字母顺序按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, ' ']]

1 个答案:

答案 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, '']]

目前还不完全清楚是否需要遵循其他排序标准,而且这个解决方案并不完全漂亮,但至少它会对前面的字符串进行排序并将其余部分保留在后面。