根据列表Python中的特定部分对列表进行排序

时间:2017-04-26 01:31:39

标签: python list sorting

我有一个格式列表:

Apple, Orange[123 431]43351
Banana, Cherry[141 421]23423
Coconut, Mango[23 12312]232342
....
....

我想根据括号后的数字对列表进行排序']'。 输出应为:

Banana, Cherry[141 421]23423 
Apple, Orange[123 431]43351 
Coconut, Mango[23 12312]232342

我正在尝试使用以下方法对列表进行排序:

LIST.sort(key = lambda x: x.split()[1])
for item in LIST:
    print(item)

我可以通过这个找到最后一个数字: 但我无法对其进行排序

for item in LIST:
    bracket_index = item.find("]")
    end_of_line = item[bracket_index + 1:]
    if bracket_index != -1:
        print(end_of_line)

2 个答案:

答案 0 :(得分:2)

您的列表格式是什么?它是元组列表还是字符串列表?这有效:

a = ['Apple, Orange[123 431]43351',
'Banana, Cherry[141 421]23423',
'Coconut, Mango[23 12312]232342']

a.sort(key = lambda el: el.split(']')[1])
print(a)

Output:
 ['Coconut, Mango[23 12312]232342',
 'Banana, Cherry[141 421]23423',
 'Apple, Orange[123 431]43351']

如果它是一对字符串对,那么你应该使用key = lambda el: el[1].split(']')[1],如下所示:

a = [('Apple', 'Orange[123 431]43351'),
('Banana', 'Cherry[141 421]23423'),
('Coconut',' Mango[23 12312]232342')]

a.sort(key = lambda el: el[1].split(']')[1])
print(a)

Output:
[('Coconut', ' Mango[23 12312]232342'),
 ('Banana', 'Cherry[141 421]23423'),
 ('Apple', 'Orange[123 431]43351')]

答案 1 :(得分:0)

你可以参考@ Psidom的建议:

LIST.sort(key=lambda x: int(x.split(']')[1]))

注意使用int()来确保排序是以数字方式而不是通过字符串比较(这是懒惰地完成;即,'4321'被认为是“大于”由于'20000000''4' > '2'。{/ p>

完整示例:

LIST = [
    'Apple, Orange[123 431]43351',
    'Banana, Cherry[141 421]23423',
    'Coconut, Mango[23 12312]232342'
]

LIST.sort(key=lambda x: int(x.split(']')[1]))
print(LIST)

更好的方法是先解析字符串。例如:

from collections import namedtuple
import re

FruitTuple = namedtuple('FruitTuple', ['fruit', 'color', 'num1', 'num2', 'num3'])

unparsed_list = [
    'Apple, Orange[123 431]43351',
    'Banana, Cherry[141 421]23423',
    'Coconut, Mango[23 12312]232342'
]

split_list = [re.search('(\\w+), (\\w+)\\[(\\d+) (\\d+)\\](\\d+)', x).groups() for x in unparsed_list]
fruit_list = [FruitTuple(*x) for x in split_list]
fruit_list.sort(key=lambda x: int(x.num2))

print(fruit_list)

产地:

  

[FruitTuple(fruit ='Banana',color ='Cherry',num1 ='141',num2 ='421',num3 ='23423'),FruitTuple(fruit ='Apple',color ='Orange' ,num1 ='123',num2 ='431',num3 ='43351'),FruitTuple(fruit ='Coconut',color ='Mango',num1 ='23',num2 ='12312',num3 ='232342 “)]