繁体   English   中英

根据另一个字符串列表对字符串列表进行排序

[英]Sorting list of strings based on another list of strings

我有两个列表xy 前者始终长于或等于后者。

x = ["foo","bar","qux","zox"]
y1 = ["zox", "qux","foo"]

我要做的是根据x的顺序对y1进行排序。 屈服

["foo","qux","zox"]

我尝试了这个,但是不起作用:

In [10]: [x[1] for x in sorted(zip(x,y))]
Out[10]: ['zox', 'qux']

什么是正确的方法?

您可以使用sortedkey参数来使用第一个列表中的index

>>> sorted(y1, key=x.index)
['foo', 'qux', 'zox']

只要遍历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']

请注意,取决于列表的大小.index需要进行线性扫描,并且价格昂贵。 您可以只创建一个key-> last索引的一次性字典,然后将其用作排序的参考:

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转换为set,然后仅将元素也保留在x ,例如:

filter(set(y1).__contains__, x)

您还可以在排序时定义自定义比较器 ,如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM