2015-12-21 24 views
1

我有一個列表:排序元組的值使用列表時,值等於

test1 = ["a","b","c","d","e","f","g","h","i"] 

和元組的列表:

test2 = [("c",1),("g",1),("b",1),("e",1),("g",1),("d",10),("a",10)] 

我需要排序的:

[val for (key, val) in test2] 

val等於相同val的排序方式爲test1

test3 = [("b",1),("c",1),("e",1),("f",1),("g",1),("a",10),("d",10)] 
+0

那麼你有什麼嘗試?它是什麼工作,什麼不是? – tglaria

回答

4

sorted接受可選參數key。使用函數的返回值(每個項目傳遞給函數)而不是項目本身。

>>> test1 = ["a","b","c","d","e","f","g","h","i"] 
>>> test2 = [("c",1),("g",1),("b",1),("e",1),("g",1),("d",10),("a",10)] 
>>> sorted(test2, key=lambda x: (x[1], test1.index(x[0]))) 
[('b', 1), ('c', 1), ('e', 1), ('g', 1), ('g', 1), ('a', 10), ('d', 10)] 

鑑於上述鍵功能順序將是由第一數目,則在test1位置。

2

使用dict映射每個字符串中TEST1其指數關係你按索引和查找是0(1)這樣:

test1 = ["a","b","c","d","e","f","g","h","i"] 
inds = dict(zip(test1, range(len(test1)))) 

test2 = [("c",1),("g",1),("b",1),("e",1),("g",1),("d",10),("a",10)] 


print(sorted(test2,key=lambda x: (x[1], inds[x[0]]))) 

輸出:

[('b', 1), ('c', 1), ('e', 1), ('g', 1), ('g', 1), ('a', 10), ('d', 10)] 

如果你真的想要的字符串按排序順序排列,您可以直接使用字符串本身,使用itemgetter代替lambda:

test2 = [("c", 1), ("g", 1), ("b", 1), ("e", 1), ("g", 1), ("d", 10), ("a", 10)] 
from operator import itemgetter 

print(sorted(test2, key=itemgetter(1, 0))) 
[('b', 1), ('c', 1), ('e', 1), ('g', 1), ('g', 1), ('a', 10), ('d', 10)] 
+0

'itemgetter'比'lambda'快嗎? –

+1

@IronFist,yep,itemgetter作爲c級發生 –