2017-07-14 210 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')