2017-07-14 159 views
0

我试图对包含3个嵌套列表的列表进行排序:路径,文件名和最终文件创建时间。所以我想对它们进行排序以获得最新的文件。排序嵌套列表

因此,我看到人们一直在使用lambda来做这件事,但是我觉得不习惯使用这些类型,并且不知道如何使用该作品进行排序。

我认为最好的办法就是切换列表组件,但是这并不工作:

class FILE: 
    PATH = 0 
    NAME = 1 
    DATE = 2 

mayaFiles = [[],[],[]] 
mayaFiles[FILE.DATE] = [0,56,3,12,7,35,16] 

doSwitch = True 
while (doSwitch): 
    for ma in range(0, len(mayaFiles[FILE.DATE])-1): 
     doSwitch = False 
     doSwitch = mayaFiles[FILE.DATE][ma] > mayaFiles[FILE.DATE][ma+1] 
     hi = mayaFiles[FILE.DATE][ma] 
     lo = mayaFiles[FILE.DATE][ma+1] 
     if doSwitch: 
      mayaFiles[FILE.DATE][ma] = lo 
      mayaFiles[FILE.DATE][ma+1] = hi 
     else: 
      break 

print mayaFiles[FILE.DATE] 

回答

0

假设这些列表已经对准的,你将有一个更容易的时间梳理存在分离列表成按排序顺序排列的元组列表。 collections模块中的namedtuple构造非常适合这种情况。我假设您可以将您的数据分为三个列表:paths,datesnames。我在这里提供了一些虚拟数据,所以你可以看到我的假设。

names = "a.ma", "b.ma", "c.ma", "d.ma" 
paths = "c:/test", "c/test", "c:/other", "d:/extra" 
dates = "17-01-01", "16-01-01", "17-02-01", "17-06-30" 

# this creates a namedtuple, which is a 
# mini-class with named fields that otherwise 
# works like a tuple 

from collections import namedtuple 
record = namedtuple("filerecord", "date name path") 

# in real use this should be a list comp 
# but this is easier to read: 

records = []  
for date, name, path in zip(dates, names, paths): 
    records.append(record(date, name, path)) 

records.sort(reverse=True) 
for item in records: 
    print item 

# filerecord(date='17-06-30', name='d.ma', path='d:/extra') 
# filerecord(date='17-02-01', name='c.ma', path='c:/other') 
# filerecord(date='17-01-01', name='a.ma', path='c:/test') 
# filerecord(date='16-01-01', name='b.ma', path='c/test') 

你可以排序使用 '钥匙' 的说法等领域sort()

records.sort(key=lambda k: k.name) 
for item in records: 
    print item 

# filerecord(date='17-01-01', name='a.ma', path='c:/test') 
# filerecord(date='16-01-01', name='b.ma', path='c/test') 
# filerecord(date='17-02-01', name='c.ma', path='c:/other') 
# filerecord(date='17-06-30', name='d.ma', path='d:/extra')