Python 使用由空格分隔的整数字符串对列表进行排序

Python 使用由空格分隔的整数字符串对列表进行排序,python,python-3.x,string,list,python-2.x,Python,Python 3.x,String,List,Python 2.x,Python: 我有一个具有以下结构的一维列表(每个条目都是由空格分隔的整数字符串): 但是我在寻找一个关于行和列顺序中每个整数的排序顺序,也就是说,预期的输出是 vals = [ "8", "8 49", "8 49 124", "8 49 516", "8 51", "8 51 122", "49"

Python: 我有一个具有以下结构的一维列表(每个条目都是由空格分隔的整数字符串):

但是我在寻找一个关于行和列顺序中每个整数的排序顺序,也就是说,预期的输出是

vals = [
    "8",
    "8 49",
    "8 49 124",
    "8 49 516",
    "8 51",
    "8 51 122",
    "49",
    "49 122",
    "49 122 124",
    "49 122 516",
    "51",
    "51 122",
    "121",
    "121 122",
    "122",
    "122 124",
    "150",
    "171",
    "516",
    "878",
]
我尝试过使用
sort()
以及
sorted()
机制,但似乎没有任何效果
sort\u len=list1.sort(key=int)
-->这是抛出值错误,因为每个列表都是分隔的字母字符串


我想按行值对列表进行排序,即按行中的第一个整数排序(如果行值相同,则按相同的第一个整数排序,然后转到下一列)

您可以按每行的最小值排序


list1.sort(key=lambda e:min([int(se)表示e.split()中的se])
您可以按每行的最小值进行排序


list1.sort(key=lambda e:min([int(se)表示e.split()中的se])

技巧是将每个字符串转换为整数元组

print(sorted(vals, key = lambda y: tuple(int(x) for x in y.split())))

['8', '8 49', '8 49 124', '8 49 516', '8 51', '8 51 122', '8 122 516', '8 124', '8 171', '8 516', '49', '49 122', '49 122 124', '49 122 516', '51', '51 122', '121', '121 122', '122', '122 124', '150', '171', '516', '878']

诀窍是将每个字符串转换为整数元组

print(sorted(vals, key = lambda y: tuple(int(x) for x in y.split())))

['8', '8 49', '8 49 124', '8 49 516', '8 51', '8 51 122', '8 122 516', '8 124', '8 171', '8 516', '49', '49 122', '49 122 124', '49 122 516', '51', '51 122', '121', '121 122', '122', '122 124', '150', '171', '516', '878']

您可以使用sorted函数,也可以使用其中的键参数根据您的cutomised方式对值进行排序。我已经为此编写了代码。请看以下内容:

lis =["121","51 122","122 123 23","2 13 4"]
newlis =[]
for i in lis:
    numbers = [int(s) for s in i.split(" ")]
    numbers = [str(s) for s in sorted(numbers)]
    newlis.append(str(" ".join(numbers)))
newlis = sorted(newlis,key = lambda x: [int(s) for s in x.split(" ")][0])
print(newlis)

您可以使用sorted函数,也可以使用其中的键参数根据您的cutomised方式对值进行排序。我已经为此编写了代码。请看以下内容:

lis =["121","51 122","122 123 23","2 13 4"]
newlis =[]
for i in lis:
    numbers = [int(s) for s in i.split(" ")]
    numbers = [str(s) for s in sorted(numbers)]
    newlis.append(str(" ".join(numbers)))
newlis = sorted(newlis,key = lambda x: [int(s) for s in x.split(" ")][0])
print(newlis)

首先,您可以使用

[list(map(int, i.split())) for i in vals]
然后按从最后到第一的值的每个索引对列表进行排序。假设长度最多可以是3

func = lambda x,p: x[len(x)-p if len(x)-p > 0 else 0]
vals = sorted(vals, key=lambda x: func(x,1))
vals = sorted(vals, key=lambda x: func(x,2))
vals = sorted(vals, key=lambda x: func(x,3))
然后您的VAL将被排序。例如,如果您运行示例变量,则输出将是

[[8], [8, 49], [8, 51], [8, 124], [8, 171], [8, 516], [8, 49124], [8, 49516], [8, 51122], [8, 122516], [49], [49, 122], [49, 122124], [49, 122516], [51], [51, 122], [121], [121, 122], [122], [122, 124], [150], [171], [516], [878]]
之后,只需使用

vals = list(map(lambda x:" ".join([str(i) for i in x]), vals))
作为功能的完整程序:

def sort_vals(vals):
    vals = [list(map(int, i.split())) for i in vals]

    func = lambda x,p: x[len(x)-p if len(x)-p > 0 else 0]
    vals = sorted(vals, key=lambda x: func(x,1))
    vals = sorted(vals, key=lambda x: func(x,2))
    vals = sorted(vals, key=lambda x: func(x,3))

    vals = list(map(lambda x:" ".join([str(i) for i in x]), vals))
    return vals

首先,您可以使用

[list(map(int, i.split())) for i in vals]
然后按从最后到第一的值的每个索引对列表进行排序。假设长度最多可以是3

func = lambda x,p: x[len(x)-p if len(x)-p > 0 else 0]
vals = sorted(vals, key=lambda x: func(x,1))
vals = sorted(vals, key=lambda x: func(x,2))
vals = sorted(vals, key=lambda x: func(x,3))
然后您的VAL将被排序。例如,如果您运行示例变量,则输出将是

[[8], [8, 49], [8, 51], [8, 124], [8, 171], [8, 516], [8, 49124], [8, 49516], [8, 51122], [8, 122516], [49], [49, 122], [49, 122124], [49, 122516], [51], [51, 122], [121], [121, 122], [122], [122, 124], [150], [171], [516], [878]]
之后,只需使用

vals = list(map(lambda x:" ".join([str(i) for i in x]), vals))
作为功能的完整程序:

def sort_vals(vals):
    vals = [list(map(int, i.split())) for i in vals]

    func = lambda x,p: x[len(x)-p if len(x)-p > 0 else 0]
    vals = sorted(vals, key=lambda x: func(x,1))
    vals = sorted(vals, key=lambda x: func(x,2))
    vals = sorted(vals, key=lambda x: func(x,3))

    vals = list(map(lambda x:" ".join([str(i) for i in x]), vals))
    return vals

列和行的分离排序。不,for循环有点像python

代码:

输出:

已排序列:

['121', '121 122', '122', '122 124', '150', '171', '49', '49 122', '49 122 124', '49 122 516', '51', '51 122', '516', '8', '8 122 516', '8 124', '8 171', '8 49', '8 49 124', '8 49 516', '8 51', '8 51 122', '8 516', '878']
已排序行:

['8', '8 122 516', '8 124', '8 171', '8 49', '8 49 124', '8 49 516', '8 51', '8 51 122', '8 516', '49', '49 122', '49 122 124', '49 122 516', '51', '51 122', '121', '121 122', '122', '122 124', '150', '171', '516', '878']

列和行的分离排序。不,for循环有点像python

代码:

输出:

已排序列:

['121', '121 122', '122', '122 124', '150', '171', '49', '49 122', '49 122 124', '49 122 516', '51', '51 122', '516', '8', '8 122 516', '8 124', '8 171', '8 49', '8 49 124', '8 49 516', '8 51', '8 51 122', '8 516', '878']
已排序行:

['8', '8 122 516', '8 124', '8 171', '8 49', '8 49 124', '8 49 516', '8 51', '8 51 122', '8 516', '49', '49 122', '49 122 124', '49 122 516', '51', '51 122', '121', '121 122', '122', '122 124', '150', '171', '516', '878']

可以假设每一行都已按列排序,即每一行都按列排序顺序
key=lambda x:tuple(map(int,x.split())
may workIt仍在抛出错误:list1.sort(key=lambda x:tuple(map(int,x.split(')))ValueError:int()的文本无效,底数为10:'39 41'@ManojS-x.split()不是x.split(','))相同但不同
key=lambda x:[int(n)for n in x.split()]
可以假设每一行都已按列排序,即每一行都按列排序顺序
key=lambda x:tuple(map(int,x.split())
可能工作它仍在抛出错误:list1.sort(key=lambda x:tuple(map(int,x.split(',')))ValueError:以10为基数的int()的文本无效:“39 41 48”@ManojS-x.split()不是x.split(“,”)相同但不同
key=lambda x:[int(n)表示x.split()中的n]
非常感谢您的输入@Adithya,但是,如果我当前的列表是这样的话:[1004
101
10515
110
38110
38170
38286
3839
3839110
3839170
38394148
38394148
383948110
383948170
3841
3841
3848
3848
3848110
3848170
3848170
3848170
3848170
8
]我看到使用建议的排序的结果如下:[8
3839
3839110
3839170
383941
38394148
383948110
383948110
3841
3848
3848
3848110
3848170
39
101
110
1004
1146
10515
]订购开始失败w.r.t第三列非常感谢您的输入@Adithya,但如果我当前的列表如下:[1004
101
10515
110
38110
38170
38286
3839
3839110
3839170
38394148
38394148
383948110
383948170
3841
3841
3848
3848
3848110
3848170
3848170
3848170
3848170
8
]我看到使用建议的排序的结果如下:[8
3839
3839110
3839170
383941
38394148
383948110
383948110
3841
3848
3848
3848110
3848170
39
101
110
1004
1146
10515
]排序开始失败w.r.t第三列非常感谢您@PILLI Vineth的输入。我尝试了您建议的方法,但我看到一个未排序的列表:[37 38
37
38 39 170
38 48 110
38 170
38 41 48
38 39 170
38 48
非常感谢您@PILLI Vineth的输入。我尝试了您建议的方法,但我看到一个未排序的列表:[37 38
37
38 39 170
38 48 110
38 170
38 41 48
38 39 41
38 48 170
38 41
38 39
38 48
38非常感谢您的输入@Lior Cohen。这确实很有魅力。以下是结果列表:[38
38 39
38 39 41
38 39 41 48
38 39 48
38 39 48 110
38 39 48 170
38 39 110
38 39 170
38 41
38 48
38 48
38 48 110
38 48
38 110
38 170
38 286
39
“欢迎你”Maojs。请考虑在你有特权的时候给予某人1的奖励。非常感谢你的输入@ Lior Cohen。这确实是一个魅力。下面是结果列表:[ 38 ] BR>38,39>BR> 38 39 41(BR> 3)。