2012-11-12 28 views
1

如果我有子列表A:['E','C','W'],那麼根據主人的順序排列子列表最有趣的方式是什麼列表M:['C','B','W','E','K']大多數pythonic的方式,從一個有序列表中訂購一個子列表

我的解決方案似乎相當簡陋。我很好奇,如果有更多'pythonic'的方式來獲得相同的結果。

ORDER = ['C','B','W','E','K'] 
possibilities = ['E','C', 'W'] 
possibilities_in_order = [] 

for x in ORDER: 
    if x in possibilities: possibilities_in_order.append(x) 

回答

8
>>> order = ['C','B','W','E','K'] 
>>> possibilities = ['E','C','W'] 
>>> possibilities_in_order = sorted(possibilities, key=order.index) 
>>> possibilities_in_order 
['C', 'W', 'E'] 

這是如何工作:在possibilities每個elementorder.index(element)被調用,並且列表僅僅是那些各自的位置來分類。

更多詳細信息:Built-in Functions → sorted

+1

男人你們太快了。 – arshajii

2
possibilities.sort(key=lambda x : ORDER.index(x)) 
2

這裏的一個線性時間的解決方案:

posset = set(possibilities) 
[letter for letter in order if letter in posset] 

這會篩選了子列表的唯一成員的主列表。它是O(n),因爲它只遍歷主列表一次,並且如果子列表的大小與主列表大小相近,它將表現良好。

這也假定possibilities沒有重複。但是,如果有必要,您可以處理它,儘管它會使代碼更復雜。

+1

不錯。如果可能性的元素可以重複,這將不起作用。但我想他們不能。 –

相關問題