基于另一个字符串列表对字符串列表进行排序

时间:2015-03-18 01:42:52

标签: python sorting

我有两个列表xy。前者总是长于或等于后者。

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']

做正确的方法是什么?

4 个答案:

答案 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']