我有两个列表x
和y
。前者总是长于或等于后者。
x = ["foo","bar","qux","zox"]
y1 = ["zox", "qux","foo"]
我想要做的是根据y1
的顺序对x
进行排序。
屈服
["foo","qux","zox"]
我尝试了这个,但没有工作:
In [10]: [x[1] for x in sorted(zip(x,y))]
Out[10]: ['zox', 'qux']
做正确的方法是什么?
答案 0 :(得分:4)
您可以使用key
的{{1}}参数来使用第一个列表中的sorted
。
index
答案 1 :(得分:2)
只需遍历x
中的每个元素,只有y1
中存在相应的元素时才将该元素添加到新列表中。
>>> x = ["foo","bar","qux","zox"]
>>> y1 = ["zox", "qux","foo"]
>>> l = []
>>> for i in x:
if i in y1:
l.append(i)
>>> l
['foo', 'qux', 'zox']
或强>
使用list_comprehension。
>>> [i for i in x if i in y1]
['foo', 'qux', 'zox']
答案 2 :(得分:1)
请注意,根据您的列表.index
的大小,需要进行线性扫描,而且费用可能很高。您可以只创建一个关键字>最后一个索引的字典,然后将其用作排序参考:
x = ["foo","bar","qux","zox"]
y1 = ["zox", "qux","foo"]
y1.sort(key=lambda L, d={k:i for i,k in enumerate(x)}: d[L])
# ['foo', 'qux', 'zox']
但是,您也可以反过来做,这可能会更有效...转换y1
设置然后只保留x
中的元素,例如:
filter(set(y1).__contains__, x)
答案 3 :(得分:0)
您还可以定义custom comparator for when sorting,如下所示:
x = ["foo","bar","qux","zox"]
y1 = ["zox", "qux","foo"]
def foo_sort(a,b):
return x.index(a)-x.index(b)
y1.sort(cmp=foo_sort)
print y1
给出:
['foo', 'qux', 'zox']