当值为None或空字符串python时排序

时间:2015-06-22 09:13:33

标签: python list sorting null

我有一个包含字典的列表,我在其中对不同的值进行排序。我正在使用这些代码行:

def orderBy(self, col, dir, objlist):
    if dir == 'asc':
        sorted_objects = sorted(objlist, key=lambda k: k[col])
    else:
        sorted_objects = sorted(objlist, key=lambda k: k[col], reverse=True)
    return sorted_objects

现在的问题是,当我尝试排序时,我偶尔会有空值或空字符串,然后它们都会崩溃。

我不确定,但我认为这是抛出的异常:无法解决的类型:NoneType()< NoneType()。当我正在尝试排序的列上有None值时会发生这种情况。对于空字符串值,它可以工作,虽然它们最终在列表中排在第一位,但我希望它们是最后一个。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

如果您希望None''值显示在最后,您可以让key函数返回一个元组,因此列表按该元组的自然顺序排序。元组的格式为(is_none, is_empty, value);这样,None值的元组将为(1, 0, None)''(0, 1, ''),其他为(0, 0, "anything else")。因此,这将首先排序正确的字符串,然后排空字符串,最后排序None

示例:

>>> list_with_none = [(1,"foo"), (2,"bar"), (3,""), (4,None), (5,"blub")]
>>> col = 1
>>> sorted(list_with_none, key=lambda k: (k[col] is None, k[col] == "", k[col])) 
[(2, 'bar'), (5, 'blub'), (1, 'foo'), (3, ''), (4, None)]

答案 1 :(得分:0)

在Python 3上感到羞耻。这是一个非常容易理解的概念。那没有排序在任何其他值之前。

public void Assign(int data)
{
    if (this.root == null)
    {
        this.root = new ChildClass(data);
    }
    else
    {
        this.root.data = data;
    }
}

public void Assign(ChildClass root)
{
    this.root = root;
}

对强力打字的痴迷使我无所适从。如果我们想要Java或C#,我们会使用它。 python趋向于收敛到其较大的语言功能表面积的趋势是朝错误方向迈出的一步。

要回答该问题并能够正确排序,必须引入大量的低效率来创建“膨胀的元组”。

A = [1,2,3,None]; B = list(sorted(A)) B = [None,1,2,3];

现在已映射到

的空缺程度

A = [(1,2,3,None)]

然后排序,然后解压。

真的有个人认为这种开销和额外的代码会导致 less 错误,而不是同意None <0。

庇护由囚犯管理。

SQL语言弄错了A = [(1,1), (1,2), (1,3), (0,None)](像NULL这样的简单表达式的计算结果既不是5 == NULL也不是True,而是False),我为Python感到骄傲他们说对了。 NULL显然是错误的。但是现在有了这种分拣机,看来他们也弄错了。