从订购列表中订购子列表的大多数pythonic方法

时间:2012-11-12 21:23:28

标签: python

如果我有子列表A:['E','C','W'],根据主列表M的顺序命令子列表的最pythonic方式是什么:['C','B' , 'W', 'E', 'K']

我的解决方案似乎相当简陋。我很好奇是否有更'pythonic'的方法来获得相同的结果。

ORDER = ['C','B','W','E','K']
possibilities = ['E','C', 'W']
possibilities_in_order = []

for x in ORDER:
    if x in possibilities: possibilities_in_order.append(x)

3 个答案:

答案 0 :(得分:8)

>>> order = ['C','B','W','E','K']
>>> possibilities = ['E','C','W']
>>> possibilities_in_order = sorted(possibilities, key=order.index)
>>> possibilities_in_order
['C', 'W', 'E']

这是如何工作的:对于element中的每个possibilities,都会调用order.index(element),并且列表只是按相应位置排序。

更多详情:Built-in Functions → sorted

答案 1 :(得分:2)

possibilities.sort(key=lambda x : ORDER.index(x))

答案 2 :(得分:2)

这是一个线性时间解决方案:

posset = set(possibilities)
[letter for letter in order if letter in posset]

仅过滤子列表成员的主列表。它是O(n),因为它只遍历主列表一次,如果子列表的大小接近主列表,它将表现良好。

这也假定possibilities没有重复。但是,如果需要,您可以处理它,尽管它会使代码更复杂。