2015-12-18 47 views
0

我有兩個列表。一個列表只包含隨機順序的元素(y),而另一個有序列表具有列表子集(x)。這些列表子集的第一個元素與隨機列表相同。從另一個列表中提取部分列表

我想要第二個列表中的所有元素出現在第一個列表中,但順序相同。這裏有一個例子:

輸入:

x = [[1,'a'],[2,'b'],[3,'c'],[4,'d'],[5,'d']] 
y = [4,1,2] 

所需的輸出:

[[4, 'd'], [1, 'a'], [2, 'b']] # Same sequence as y but elements in x 

我已經寫了一些代碼來實現這一目標:

for i in range(0,len(y)): 
    for k in range(0,len(x)): 
     if y[i] ==x[k][0]: 
      d.append(x[k]) 

但是,我不知道如果這是解決這個問題的最有效方法。這僅僅是一個例子,實際上,我的列表x包含超過一百萬個子列表,所以如果我嘗試使用此代碼,它將循環超過一百萬次x

如何讓此代碼更高效?

+0

'y'有多大?只有一些像這個例子那樣的元素,或者像'x'一樣大? – ASCIIThenANSI

+1

另外,是否重複了任何第一個元素(例如,'4'多次出現作爲第一個元素)?答案取決於他們是否。 – ASCIIThenANSI

+0

y中的索引值是否在x中? –

回答

3

有不能使用的字典(即是第一要素不斷重複?),做一些像任何理由:

>>> d = {1: "a", 2: "b", 3: "c", 4: "d", 5: "d"} 
>>> map(lambda x: [x,d.get(x)], [4,1,2]) 
[[4, 'd'], [1, 'a'], [2, 'b']] 
1

您可以將列表的列表轉換爲一個字典,然後只是在你的y列表循環,同時做一個列表理解像這樣

x = [[1,'a'],[2,'b'],[3,'c'],[4,'d'],[5,'d']] 
d = dict(x) 
y=[4,1,2] 
newlist = [[i,d[i]] for i in y] 
print newlist 
1

另一種方式是有其存在的y然後排序結果列表順序相同y第一項第一過濾元件:

>>> x 
[[1, 'a'], [2, 'b'], [3, 'c'], [4, 'd'], [5, 'd']] 
>>> y 
[4, 1, 2] 
>>> l = filter(lambda s:s[0] in y, x) 
>>> l 
[[1, 'a'], [2, 'b'], [4, 'd']] 
>>> sorted(l, key=lambda s: y.index(s[0])) 
[[4, 'd'], [1, 'a'], [2, 'b']]