在嵌套列表中为元素排序嵌套列表?

时间:2014-11-16 03:44:05

标签: python

General Motors,Chevrolet,K1500 TAHOE 4WD,18,2900,Standard SUV 4WD
General Motors,Chevrolet,TRAVERSE AWD,19,2750,Standard SUV 4WD
Chrysler Group LLC,Dodge,Durango AWD,19,2750,Standard SUV 4WD
Chrysler Group LLC,Dodge,Durango AWD,16,3400,Standard SUV 4WD
Ford Motor Company,Ford,Expedition 4WD,17,3100,Standard SUV 4WD
Ford Motor Company,Ford,EXPLORER AWD,19,2750,Standard SUV 4WD

说我有这些台词。如何根据每行中的第5个元素按顺序排列所有行? (在第一行,18)

3 个答案:

答案 0 :(得分:2)

这是第四个元素,所以你可以使用lambda作为逗号的键分割:

 s="""
General Motors,Chevrolet,K1500 TAHOE 4WD,18,2900,Standard SUV 4WD
General Motors,Chevrolet,TRAVERSE AWD,19,2750,Standard SUV 4WD
Chrysler Group LLC,Dodge,Durango AWD,19,2750,Standard SUV 4WD
Chrysler Group LLC,Dodge,Durango AWD,16,3400,Standard SUV 4WD
Ford Motor Company,Ford,Expedition 4WD,17,3100,Standard SUV 4WD
Ford Motor Company,Ford,EXPLORER AWD,19,2750,Standard SUV 4WD
"""
print(sorted(s.splitlines()[1:],key=lambda x:x.split(",")[3]))

['Chrysler Group LLC,Dodge,Durango AWD,16,3400,Standard SUV 4WD', 'Ford Motor Company,Ford,Expedition 4WD,17,3100,Standard SUV 4WD', 'General Motors,Chevrolet,K1500 TAHOE 4WD,18,2900,Standard SUV 4WD', 'General Motors,Chevrolet,TRAVERSE AWD,19,2750,Standard SUV 4WD', 'Chrysler Group LLC,Dodge,Durango AWD,19,2750,Standard SUV 4WD', 'Ford Motor Company,Ford,EXPLORER AWD,19,2750,Standard SUV 4WD']

从文件中读取:

with open("in.txt") as f:
    print(sorted(f,key=lambda x:x.split(",")[3]))
['Chrysler Group LLC,Dodge,Durango AWD,16,3400,Standard SUV 4WD\n', 'Ford Motor Company,Ford,Expedition 4WD,17,3100,Standard SUV 4WD\n', 'General Motors,Chevrolet,K1500 TAHOE 4WD,18,2900,Standard SUV 4WD\n', 'General Motors,Chevrolet,TRAVERSE AWD,19,2750,Standard SUV 4WD\n', 'Chrysler Group LLC,Dodge,Durango AWD,19,2750,Standard SUV 4WD\n', 'Ford Motor Company,Ford,EXPLORER AWD,19,2750,Standard SUV 4WD']

答案 1 :(得分:0)

您可以执行以下操作:

l=[[1,2,3,4,8,6], [1,2,3,4,7,6]]
l.sort(key=lambda x: x[4]) 

l将是您所有列表的列表。

答案 2 :(得分:0)

这种事情通常更好,而不诉诸lambda s - 改为使用operator.itemgetter

from operator import itemgetter    

data = """
General Motors,Chevrolet,K1500 TAHOE 4WD,18,2900,Standard SUV 4WD
General Motors,Chevrolet,TRAVERSE AWD,19,2750,Standard SUV 4WD
Chrysler Group LLC,Dodge,Durango AWD,19,2750,Standard SUV 4WD
Chrysler Group LLC,Dodge,Durango AWD,16,3400,Standard SUV 4WD
Ford Motor Company,Ford,Expedition 4WD,17,3100,Standard SUV 4WD
Ford Motor Company,Ford,EXPLORER AWD,19,2750,Standard SUV 4WD
"""

data_lines = [x.split(",") for x in data.splitlines()[1:]]

print sorted(data_lines, key=itemgetter(3))

# Optionally join back to strings:
map(",".join, sorted(data_lines, key=itemgetter(3)))

可选地,使用文件可迭代的方法:

from string import split
from functools import partial
from operator import itemgetter

getter = itemgetter(3)
splitter = partial(split, sep=",")

def sort_key(s):
    return getter(splitter(s))

with open("data_file.txt") as data:
    print sorted(data, key=sort_key))

这很好地区分了不同的部分(拆分分隔符,用于排序的特定项索引,以及对sorted的实际调用),否则这些部分在单个lambda内很难耦合。

相关问题