[英]Sorting list of strings based on another list of strings
我有两个列表x
和y
。 前者始终长于或等于后者。
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']
什么是正确的方法?
您可以使用sorted
的key
参数来使用第一个列表中的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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.