排序字符串列表时出现问题

问题描述 投票:3回答:2

我目前有以下字符串列表:

['0\t ***       *', '1\t    *     *', '2\t     *   *', '3\t      ***', 
 '-1\t            *', '-2\t             *', '-3\t              **']

所以,我试图对列表进行排序,使其成为:

['3\t      ***', '2\t     *   *', '1\t    *     *', '0\t ***       *', 
'-1\t            *', '-2\t             *', '-3\t              **']

但是,当我使用时:

new_list = sorted(new_list, reverse=True)

我得到以下内容:

['3\t      ***', '2\t     *   *', '1\t    *     *', '0\t ***       *',
'-3\t              **', '-2\t             *', '-1\t            *']

我如何修复它,以便在列表中的字符串排序时考虑-3而不仅仅是 - 考虑-3。

python python-3.x
2个回答
3
投票

字符串列表按字母顺序排序。

您需要提供一个键函数,以便在'\t' char上拆分,并将第一个字段解析为整数:

>>> l=['0\t ***       *', '1\t    *     *', '2\t     *   *', '3\t      ***', '-1\t            *', '-2\t             *', '-3\t              **']
>>> l.sort(key=lambda x: int(x.split('\t')[0]), reverse=True)
>>> l
['3\t      ***', '2\t     *   *', '1\t    *     *', '0\t ***       *', '-1\t            *', '-2\t             *', '-3\t              **']

请注意,您可以使用new_list = sorted(new_list, reverse=True)进行就地排序,而不是使用new_list.sort(reverse=True)

或者,如果您不介意使用第三方软件包,您可以查看natsort软件包,它似乎可以解决这类问题。


1
投票

如果您的前两个字符将始终是数字(例如-1)或数字和\\t(例如2\),您可以设置自定义键和条带:

>>> sorted(i, reverse = True, key = lambda k: int(k[0:2].strip()))

['3\t      ***', '2\t     *   *', '1\t    *     *', '0\t ***       *', 
'-1\t            *', '-2\t             *', '-3\t              **']
© www.soinside.com 2019 - 2024. All rights reserved.