使用特定方法对字符串列表进行排序

时间:2018-12-21 13:55:46

标签: python string list sorting

假设我有一个这样的字符串列表

L = ['5', '3', '4', '1', '2', '2 3 5', '2 4 8', '5 22 1 37', '5 22 1 22', '5 22 1 23', ....]

我如何对列表进行排序,这样我就可以得到这样的东西:

L = ['1', '2', '3','4', '5', '2 3 5', '2 4 8', '5 22 1 22', ' 5 22 1 23', '5 22 1 37', ...]

基本上,我需要根据2个字符串之间的第一个不同数字对列表进行排序

2 个答案:

答案 0 :(得分:5)

您可以使用元组进行排序:

L = ['5', '3', '4', '1', '2', '2 3 5', '2 4 8', '5 22 1 37', '5 22 1 22', '5 22 1 23']

result = sorted(L, key=lambda x: (len(x.split()),) + tuple(map(int, x.split())))

print(result)

输出

['1', '2', '3', '4', '5', '2 3 5', '2 4 8', '5 22 1 22', '5 22 1 23', '5 22 1 37']

这个想法是使用一个元组作为键,其中第一个元素是字符串中数字的数量,其余元素是数字的元组。例如,对于'2 3 5',密钥为(3, 2, 3, 5)

如@ PM2Ring所建议,您可以使用def函数代替lambda

def key(x):
    numbers = tuple(map(int, x.split()))
    return (len(numbers),) + numbers

答案 1 :(得分:1)

与@Daniel的方法略有不同。

*Global Styles*/
*, *::before, *::after {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  overflow: hidden;
}
/*Header Section*/
header {
  position: relative;
  width: auto;
  max-width: 900px
  background-color: black;
  height: auto;
}

nav ul {
  width: 100%;
  height: 63px;
  background-color: black;
  list-style: none;
  text-align: center;
}

nav ul li {
  float: left;
  padding: 0;
  width: 200px;
}

nav ul li a {
  width: 100%;
  padding: 21.5px 0px;
  color: white;
  font-size: 20px;
  text-decoration: none;
  font-family: Verdana, sans-serif;
  text-transform: uppercase;
  transition: all .25s ease;
}

nav ul li a:hover:not(.active) {
  background-color: rgb(35, 35, 35);
}

nav .active {
  background-color: rgb(63, 63, 63);
}

nav .table {
  display: table;
  margin: 0 auto;
}

nav .color {
  background-color: black;
}

nav li a, nav li {
  display: inline-block;
}

.banner {
  width: 100%;
}

输出

idx = sorted(range(len(L)), key=lambda i: int(''.join(L[i].split())))
L = [L[i] for i in idx]