Python 为嵌套列表中的元素排序嵌套列表?

Python 为嵌套列表中的元素排序嵌套列表?,python,Python,假设我有这些台词。如何根据每行中的第5个元素将所有行按顺序排列?(在第一行,18)您可以执行以下操作: 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 Chrysle

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

您可以执行以下操作:

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

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

它是第四个元素,因此您可以使用lambda作为逗号上的键拆分:

l=[[1,2,3,4,8,6], [1,2,3,4,7,6]]
l.sort(key=lambda x: x[4]) 
从文件中读取:

 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']

这类事情通常比较好,无需求助于
lambda
s——使用
操作符。itemgetter

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']
(可选)要将文件用作可移植方法,请执行以下操作:

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)))

这很好地分离了不同的部分(拆分分隔符、用于排序的特定项索引以及对
已排序的
的实际调用),否则这些部分在单个
lambda

中会耦合得很差。18看起来像是第四个元素。如果文件打开,它会工作吗,因为您不知道下一行,你在分类吗?我以为这些是名单。回答得很好。你能给我解释一下它是如何工作的吗?因为我并没有进入下一行,也不知道会发生什么next@Hackaholic,在文件对象上调用
sorted
,迭代所有行,与
print(list(f))相同
是否有办法将这些元素重新连接成一个字符串?我觉得与您进行对话是不安全的。我不知道你是否只是想等着为你的方法辩护,或者你是否真的会不加评判、不富有成效。既然我说不出来,我就不作进一步评论了。如果你不喜欢的话,你可以随意投反对票。如果你的评论只是隐晦的嘲讽,我会更喜欢向下投票。不过,我的最终方法(文件迭代器)将与你的方法相同,没有lambda,并且对排序过程中需要执行的不同操作进行了更好的封装。第一种方法做了一些额外的中间工作来存储单词列表,但如果这是对这种方法的批评,我会翻白眼。我不需要为我的方法辩护,它是pythonic,使用lambda和sorted是一种惯用方法。我看不出你是从哪里来的,如果不求助于lambdas,这种事情通常会更好
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))