2015-08-15 147 views
-2

我有一個文件名列表,通過他們的「文件類型」,如現下令:Python的重新排列順序

list = ['categorya.1.file','categorya.2.file','categoryb.1.file','categoryc.1.file'] 

的可能類別的數量是任意的。給定類別中的文件數量是任意的。

我希望重新排列列表,以便一次讀取每個類別中的一個。所以,上面的列表將被重新安排到:

newlist = ['categorya.1.file', 'categoryb.1.file', 'categoryc.1.file', 'categorya.1.file'] 

這些列表的長度可能是巨大的,所以我會假設效率是關鍵。什麼是最好的方法來解決這個問題?

+0

_best_方式取決於你在做什麼,這個列表來自哪裏以及真實數據是什麼樣子。 – Cyphase

+0

爲了簡單起見,我刪除了上下文。但我所擁有的是我想以特定順序閱讀的文件名列表。爲了實現這一點,我想按照主文章中所述的方式對列表重新排序。 – Samuel

回答

1

下面看起來比它應該只使用groupby將列表按其類別拆分成列表更糟糕,然後使用roundrobin將這些列表組合到列表中。

使用itertools:

from itertools import groupby, islice, cycle 

# The following is from the itertools recipes 
# but it has had its splot removed for simplicity 
def roundrobin(iterables): 
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C" 
    # Recipe credited to George Sakkis 
    pending = len(iterables) 
    nexts = cycle(iter(it).next for it in iterables) 
    while pending: 
     try: 
      for next in nexts: 
       yield next() 
     except StopIteration: 
      pending -= 1 
      nexts = cycle(islice(nexts, pending)) 

test_list = ['categorya.1.file','categorya.2.file','categoryb.1.file','categoryc.1.file'] 
new_list = list(roundrobin(list(list(l) for (c, l) in groupby(test_list, lambda v: v.split('.')[0])))) 
print new_list 

打印:

['categorya.1.file', 'categoryb.1.file', 'categoryc.1.file', 'categorya.2.file'] 
1

你只需要通過強制轉換爲int數字排序,使用最後一個字母打破平局:

lst = ['categoryc.2.file','categorya.1.file','categorya.2.file', 
     'categoryb.2.file','categoryb.1.file','categoryc.1.file'] 

def key(x): 
    spl = x.split(".",2) 
    return int(spl[1]),spl[0][-1] 
lst.sort(key=key) 

輸出:

['categorya.1.file', 'categoryb.1.file', 'categoryc.1.file', 
'categorya.2.file', 'categoryb.2.file', 'categoryc.2.file'] 

如果你不關心順序一旦類別進行分組,然後只使用int

lst = ['categoryc.2.file','categorya.1.file','categorya.2.file', 
     'categoryb.2.file','categoryb.1.file','categoryc.1.file'] 

lst.sort(key=lambda x: int(x.split(".",2)[1])) 

print(lst) 
['categorya.1.file', 'categoryb.1.file', 'categoryc.1.file', 
'categoryc.2.file', 'categorya.2.file', 'categoryb.2.file'] 

.sort被就地所以你不需要建立任何其他列表。