我想执行以下操作:高效:
假设我们有这个清单:
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
它运作良好,但我相信效率不高。
答案 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
。 (除非我在测试中犯了错误)