【问题标题】:Sort a list with string of integers separated by space用空格分隔的整数字符串对列表进行排序
【发布时间】:2021-03-30 00:44:51
【问题描述】:

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

vals = ["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",
        ]

但我正在寻找关于两行和列顺序中每个整数的排序顺序,即预期输出是

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_len = list1.sort(key = int) --> 这是抛出值错误,因为每个列表都是一串分隔的字母。

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

【问题讨论】:

  • 可以假设每一行都是列排序的,即每一行都是列排序的
  • key=lambda x: tuple(map(int, x.split())) 可能会起作用
  • 它仍然抛出错误:list1.sort(key = lambda x: tuple(map(int, x.split(',')))) ValueError: invalid literal for int() with基数 10:'39 41 48'
  • @ManojS - x.split() 不是 x.split(',')
  • 相同但不同key = lambda x: [int(n) for n in x.split()]

标签: python python-3.x string list python-2.x


【解决方案1】:

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

list1.sort(key=lambda e:min([int(se) for se in e.split()]))

【讨论】:

  • 非常感谢您的意见@Adithya 但是,如果我当前的列表如下:[ 1004
    101
    10515
    110
    1146
    38 110 38 170
    38 286
    38 39
    38 39 110
    38 39 170
    38 39 41
    38 39 41 48
    38 39 48
    38 39 48 110
    38 39 48 170
    38 41
    38 41 48
    38 48
    38 48 110
    38 48 170
    39
    8
    ]
  • 我看到使用建议排序的输出为:[ 8
    38 39
    38 39 110
    38 39 170
    38 39 41
    38 39 41 48
    38 39 48
    38 39 48 110
    38 39 48 170
    38 41
    38 41 48
    38 48
    38 48 110
    38 48 170
    br> 39
    101
    110
    1004
    1146
    10515
    ] 排序从第三列开始失败
【解决方案2】:

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

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

【讨论】:

  • 非常感谢您的意见@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 41 48
    38 48
    38 48 110
    38 48 170
    38 110
    38 170
    38 286
    39
    ]
  • 不客气@ManojS。请考虑在您有权这样做时为某人提供的 -1 投票。
【解决方案3】:

您可以使用 sorted 函数,也可以使用其中的 key 参数根据您的自定义方式对值进行排序。我已经为此编写了代码。看看这个:

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)

【讨论】:

  • 非常感谢您的意见@PILLI VINEETH。我尝试了你建议的方法,但我看到一个无序列表:[ 37 38
    37
    38 39 170
    38 48 110
    38 170
    38 41 48
    38 39 48
    38 39 41
    38 48 170
    38 41
    38 39
    38 48
    38 39 48 170
    38
    ]
【解决方案4】:

您首先可以使用

将每个字符串元素分成一个整数列表
[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

【讨论】:

    【解决方案5】:

    列和行的分离排序。没有 for 循环有点 Pythonic

    代码:

    def sort_str(in_str):
        in_lst = [int(s) for s in in_str.split()]
        return ' '.join(str(i) for i in sorted(in_lst))
        
    lst = ['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' ]
    lst = [sort_str(ele) for ele in lst]
    print(lst) # Sorted columns:
    lst.sort(key = lambda s : int(s.split()[0]))
    print(lst) #Sorted rows
    

    输出:

    排序的列:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 2020-03-14
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      相关资源
      最近更新 更多