我似乎无法找到有关如何正确排序此类列表的任何信息。我的列表看起来像这样
["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"])
答案 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']