在python中排序,以及空字符串

flo*_*ian 4 python string sorted

嗨,我正在使用Python中的sorted()函数来订购一个二维数组(我想对列进行排序就像在经典电子表格中完成一样).

在下面的示例中,我使用itemgetter(0)根据第一列的内容对网格进行排序.

但排序在非空字符串之前返回空字符串.

    >>> import operator
    >>> res = [['charly','male','london'],
    ... ['bob','male','paris'],
    ... ['alice','female','rome'],
    ... ['','unknown','somewhere']]
    >>> sorted(res,key=operator.itemgetter(0))
    [['', 'unknown', 'somewhere'], ['alice', 'female', 'rome'], ['bob', 'male', 'paris'], ['charly', 'male', 'london']]
    >>> 
Run Code Online (Sandbox Code Playgroud)

虽然我需要它返回这个:

[['alice', 'female', 'rome'], ['bob', 'male', 'paris'], ['charly', 'male', 'london'], ['', 'unknown', 'somewhere']]
Run Code Online (Sandbox Code Playgroud)

有一个简单的方法吗?

kin*_*all 19

使用不同的键功能.一个可行的是:

sorted(res, key=lambda x: (x[0] == "", x[0].lower()))
Run Code Online (Sandbox Code Playgroud)

键是第一个位置的0(False)或1(True)元组,其中True表示记录中的第一个项目是空白.第二个位置具有原始记录中的名称字段.然后,Python将首先排序为非空白和空白名称组,然后在非空名称gorup中按名称排序.(Python也将在空白名称组中按名称排序,但由于名称为空白,因此不会执行任何操作.)

我还冒昧地通过在密钥中将它们全部转换为小写来使名称排序不区分大小写.

用"ZZZZZZ"或"字母高"替换空白名称很有吸引力,但是第一次有些小丑将他们的名字命名为"ZZZZZZZZ"进行测试时失败了.我'\xff' * 100觉得类似的东西可以工作,但它仍然感觉像一个黑客(也可能是潜在的Unicode陷阱).

  • 我准备写完这个答案; 这是最优雅的方式.您使用元组来"提升"您的键字母,而无需修改您不想要的任何内容. (2认同)