在python中排序,空字符串

2024-06-03 07:54:50 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

但是sorted在非空字符串之前返回空字符串。在

    >>> 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']]
    >>> 

我需要它来归还这个:

^{pr2}$

有简单的方法吗?在


Tags: 字符串排序resoperatormalefemaleunknowncharly
3条回答

使用不同的按键功能。一个可行的方法是:

sorted(res, key=lambda x: (x[0] == "", x[0].lower()))

然后,键是一个第一个位置为0(False)或1(True)的元组,其中True表示记录中的第一项为空。第二个位置有原始记录中的name字段。Python将首先对非空名称和空名称进行分组,然后在非空名称gorup中按名称排序。(Python也将按空白名称组中的名称排序,但由于名称为空,所以不会做任何事情。)

我还冒昧地将名称排序转换为键中的小写,从而使名称排序不区分大小写。在

只是用“ZZZZZ”或“字母高”来替换空白名称是很诱人的,但是第一次有些小丑把他们的名字称为“ZZZZZZZ”是不可能的。我想像'\xff' * 100这样的东西可以工作,但它仍然感觉像是一个黑客(也是潜在的Unicode陷阱)。在

可以传递键函数,返回实际值,如果第一个元素为空(空字符串的值为False),则返回100'z。在

sorted(res, key= lambda x: x[0] if x[0] else 'z'*100 )

这是可行的,尽管有点冗长:

def cmp_str_emptylast(s1, s2):
    if not s1 or not s2:
        return bool(s2) - bool(s1)

    return cmp(s1, s2)

sorted(res, key=operator.itemgetter(0), cmp=cmp_str_emptylast)

相关问题 更多 >