排序编号列表

时间:2018-02-17 20:18:54

标签: python list sorting

我似乎无法找到有关如何正确排序此类列表的任何信息。我的列表看起来像这样

["1. Banana", "2. Pear", "11. Apple", "5. Grapes", "4. Orange"]

使用sorted()给我留下以下内容

['1. Banana', '11. Apple', '2. Pear', '3. Orange', '4. Grapes']

我希望它像这样出来

['1. Banana', '2. Pear', '3. Orange', '4. Grapes', '11. Apple']

<小时/> 如果它增加了任何复杂性,我需要使用它来使用特定键的值对字典列表进行排序,所以我当前的代码是

list.sort(key=lambda k: k["key"])

3 个答案:

答案 0 :(得分:5)

.分隔的第一个int值排序为key排序:

sorted(lst, key=lambda x: int(x.split('.')[0]))

示例:

In [20]: lst = ["1. Banana", "2. Pear", "11. Apple", "5. Grapes", "4. Orange"]

In [21]: sorted(lst, key=lambda x: int(x.split('.')[0]))
Out[21]: ['1. Banana', '2. Pear', '4. Orange', '5. Grapes', '11. Apple']

答案 1 :(得分:4)

对于更强大的解决方案,使用正则表达式从字符串项中获取数字,并使用它来对列表进行排序:

>>> from re import compile
>>> 
>>> regex = compile('\d+')
>>> lst = ["1. Banana", "2. Pear", "11. Apple", "5. Grapes", "4. Orange"]
>>> sorted(lst, key= lambda el: int(regex.search(el).group()))
['1. Banana', '2. Pear', '4. Orange', '5. Grapes', '11. Apple']
>>> 

这样,即使数字不在字符串的第一部分,你的代码也不会失败:

>>> lst = ["Banana 1.", "2. Pear", "11. Apple", "5. Grapes", "4. Orange"]
>>> sorted(lst, key= lambda el: int(regex.search(el).group()))
['Banana 1.', '2. Pear', '4. Orange', '5. Grapes', '11. Apple']
>>> 

答案 2 :(得分:3)

在我看来,您应该将这些数据存储为字典:

lst = ["1. Banana", "2. Pear", "11. Apple", "5. Grapes", "4. Orange"]

d = dict((int(j[0]), j[1]) for j in [i.split('. ') for i in lst])

# {1: 'Banana', 2: 'Pear', 4: 'Orange', 5: 'Grapes', 11: 'Apple'}

然后排序很简单:

sorted(d.items())

# [(1, 'Banana'), (2, 'Pear'), (4, 'Orange'), (5, 'Grapes'), (11, 'Apple')]

格式化也是如此:

['. '.join((str(a), b)) for a, b in sorted(d.items())]

# ['1. Banana', '2. Pear', '4. Orange', '5. Grapes', '11. Apple']