python - 将列表中的一些项目移动到最后

时间:2014-10-23 12:27:01

标签: python list

我想执行以下操作:高效

假设我们有这个清单:

items = ['a','c','d','e','f','s'] #items are unique (can be a set, but its a list so items are ordered)
special_items = ['e','a']

结果应该是将items转换为:

items = ['c','d','f','s','e','a'] # e,a now at the end

我目前的解决方案是:

items = [item for item in items if item not in special_items] #remove special items
items.extend(special_items) #add them to the end of the list

它运作良好,但我相信效率不高。

1 个答案:

答案 0 :(得分:3)

首先,您可以使用itertools.chain加入两个序列。没关系,请参阅下面的编辑。

如果您不需要items 中的订购,则可以从另一套中减去一组:

sitems = set(items)
sspecial = set(special_items)
print(list(itertools.chain(sitems - sspecial, 
                           special_items)))
# ['c', 's', 'f', 'd', 'e', 'a']

如果您需要订购并且special_items很大,您可以先将special_items转换为设置来获得提升:

sspecial = set(special_items)
list(itertools.chain((x for x in items if x not in sspecial),
                     special_items))

修改:结果itertools.chain没有我想象的那么快。

%timeit list(itertools.chain((x for x in rdata if x not in rset), rlist))
10000 loops, best of 3: 111 µs per loop

%timeit [x for x in rdata if x not in rset] + rlist
10000 loops, best of 3: 79.2 µs per loop

所以执行special_items转换为集合,不要使用itertools.chain。 (除非我在测试中犯了错误)