【问题标题】:Sort when values are None or empty strings python当值为无或空字符串python时排序
【发布时间】:2015-09-07 16:17:20
【问题描述】:

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

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()

我该如何解决这个问题?

【问题讨论】:

  • 究竟是如何分解的?
  • 旁注:当你可以在这里使用sorted(..., reverse=dir != 'asc')时,不要使用if..else
  • 您需要在这里给我们一些示例数据;向我们展示这会发生什么,以及你期望会发生什么。
  • 这是来自 DataTables pluin 的 ajax 调用的一部分,所以我得到一个错误,它没有取回正确的数据。我现在要尝试一些调试来获取一些数据。
  • 我不确定,但我认为这是引发的异常:unorderable types: NoneType() < NoneType()。当我尝试排序的列上没有任何值时,就会发生这种情况。对于空字符串值,尽管它们最终在列表中排在第一位,但我希望它们排在最后。

标签: python list sorting null


【解决方案1】:

对 Python 3 感到羞耻。这是一个很好理解的概念。 None 排在任何其他值之前。

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

B = [None,1,2,3];

对强类型的痴迷让我毛骨悚然。如果我们想要 Java 或 C#,我们会使用它。 python 趋于收敛到其大面积语言特征的这种趋势是朝错误方向迈出的一步。

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

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

现在映射到的丑陋

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

然后分类,然后解包。

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

收容所由囚犯管理。

SQL 语言得到了NULL 错误(5 == NULL 等简单表达式的计算结果既不是True 也不是False,而是NULL),我为 Python 感到自豪,他们做对了。 5 == None 显然是错误的。但是现在有了这种分拣垃圾,他们似乎也弄错了。

【讨论】:

  • 我找到的最佳答案在这里:stackoverflow.com/questions/26575183/…,参见 Collin Anderson 的帖子。
  • 想象一个数据库。 select A,B from T order by A。错误:无法排序,因为 A 具有 NULL 值。让我知道您的销售情况。
【解决方案2】:

如果您希望 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)]

【讨论】:

  • @tobias_k : 一个问题...(k[col] is None, k[col] == "", k[col])) 中的元素顺序会影响输出列表中的顺序吗?
  • @KhalilAmmour-خليلعمور 当然,这就是这背后的全部想法。元组将按它们的第一个元素排序,如果相等,则按第二个元素,依此类推。
  • 如何使用多个键?我试过 sorted(a, key=lambda k: [(k[col] is None, k[col]) for col in keys] ) 但得到了奇怪的结果。
  • @KanchanSrivastava keys 这里是什么?
  • 假设字典列表而不是元组,它将如何工作?
猜你喜欢
  • 1970-01-01
  • 2016-03-05
  • 2011-03-18
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
  • 2023-03-09
  • 2012-04-10
相关资源
最近更新 更多