Python 中元组的排序列表
Sorting list of tuple in Python
我有以下已排序的元组列表,"sorted" 在 python 中:
L = [("1","blaabal"),
("1.2","bbalab"),
("10","ejej"),
("11.1","aaua"),
("12.1","ehjej"),
("12.2 (c)", "ekeke"),
("12.2 (d)", "qwerty"),
("2.1","baala"),
("3","yuio"),
("4","poku"),
("5.2","qsdfg")]
我的问题如您所见,一开始很好,但在“12.2 (d)”之后列表从“2.1”重新开始,我不知道如何解决这个问题。
谢谢
由于每个元组中的第一个元素是一个字符串,Python 正在执行词法排序,其中所有以 '1'
开头的字符串排在以 '2'
开头的字符串之前。
要获得所需的排序,您需要将第一个条目 视为 float
而不是字符串。
我们可以使用 sorted
以及自定义排序函数,该函数在排序之前将第一个条目转换为浮点数。它还保留第二个元组元素来处理您可能具有非唯一第一个条目的情况。
result = sorted(L, key = lambda x: (float(x[0].split()[0]), x[1]))
# [('1', 'blaabal'), ('1.2', 'bbalab'), ('2.1', 'baala'), ('3', 'yuio'), ('4', 'poku'), ('5.2', 'qsdfg'), ('10', 'ejej'), ('11.1', 'aaua'), ('12.1', 'ehjej'), ('12.2 (c)', 'ekeke'), ('12.2 (d)', 'qwerty')]
我必须添加一个 x[0].split()[0]
以便我们在 space 处拆分第一个元组元素并且只获取第一部分,因为有些元素具有诸如 '12.2 (d)'
之类的值,我们只想要 '12.2'
.
如果我们丢弃的第一个元素的第二部分很重要,那么您可以使用类似于以下的排序函数,将第一个元素分成几部分,然后仅将第一部分转换为浮点数,然后保留作为字符串休息。
def sorter(value):
parts = value[0].split()
# Convert the first part to a number and leave all other parts as strings
parts[0] = float(parts[0]);
return (parts, value[1])
result = sorted(L, key = sorter)
您的元组的第一个值是字符串,并按字典顺序排序。如果您希望它们保留为字符串,请使用
排序
sorted(l, key = lambda x: float(x[0]))
有一个专门为您的案例制作的包裹,名为 natsort
:
>>> from natsort import natsorted
>>> L = [('1', 'blaabal'), ('4', 'poku'), ('12.2 (c)', 'ekeke'), ('12.1', 'ehjej')]
>>> natsorted(L)
[('1', 'blaabal'), ('4', 'poku'), ('12.1', 'ehjej'), ('12.2 (c)', 'ekeke')]
我有以下已排序的元组列表,"sorted" 在 python 中:
L = [("1","blaabal"),
("1.2","bbalab"),
("10","ejej"),
("11.1","aaua"),
("12.1","ehjej"),
("12.2 (c)", "ekeke"),
("12.2 (d)", "qwerty"),
("2.1","baala"),
("3","yuio"),
("4","poku"),
("5.2","qsdfg")]
我的问题如您所见,一开始很好,但在“12.2 (d)”之后列表从“2.1”重新开始,我不知道如何解决这个问题。
谢谢
由于每个元组中的第一个元素是一个字符串,Python 正在执行词法排序,其中所有以 '1'
开头的字符串排在以 '2'
开头的字符串之前。
要获得所需的排序,您需要将第一个条目 视为 float
而不是字符串。
我们可以使用 sorted
以及自定义排序函数,该函数在排序之前将第一个条目转换为浮点数。它还保留第二个元组元素来处理您可能具有非唯一第一个条目的情况。
result = sorted(L, key = lambda x: (float(x[0].split()[0]), x[1]))
# [('1', 'blaabal'), ('1.2', 'bbalab'), ('2.1', 'baala'), ('3', 'yuio'), ('4', 'poku'), ('5.2', 'qsdfg'), ('10', 'ejej'), ('11.1', 'aaua'), ('12.1', 'ehjej'), ('12.2 (c)', 'ekeke'), ('12.2 (d)', 'qwerty')]
我必须添加一个 x[0].split()[0]
以便我们在 space 处拆分第一个元组元素并且只获取第一部分,因为有些元素具有诸如 '12.2 (d)'
之类的值,我们只想要 '12.2'
.
如果我们丢弃的第一个元素的第二部分很重要,那么您可以使用类似于以下的排序函数,将第一个元素分成几部分,然后仅将第一部分转换为浮点数,然后保留作为字符串休息。
def sorter(value):
parts = value[0].split()
# Convert the first part to a number and leave all other parts as strings
parts[0] = float(parts[0]);
return (parts, value[1])
result = sorted(L, key = sorter)
您的元组的第一个值是字符串,并按字典顺序排序。如果您希望它们保留为字符串,请使用
排序sorted(l, key = lambda x: float(x[0]))
有一个专门为您的案例制作的包裹,名为 natsort
:
>>> from natsort import natsorted
>>> L = [('1', 'blaabal'), ('4', 'poku'), ('12.2 (c)', 'ekeke'), ('12.1', 'ehjej')]
>>> natsorted(L)
[('1', 'blaabal'), ('4', 'poku'), ('12.1', 'ehjej'), ('12.2 (c)', 'ekeke')]