1

如果我有子列表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)
4

3 回答 3

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

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

更多详细信息:内置函数 →sorted

于 2012-11-12T21:25:12.620 回答
2
possibilities.sort(key=lambda x : ORDER.index(x))
于 2012-11-12T21:25:17.703 回答
2

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

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

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

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

于 2012-11-12T21:30:02.777 回答