【发布时间】:2017-07-12 12:21:29
【问题描述】:
假设我有一个元组列表[(0, 1, 2, 3), (4, 5, 6, 7), (3, 2, 1, 0)],我想删除所有反转元组的实例,例如从上面的列表中删除 (3, 2, 1, 0)。
我目前的(基本)方法是:
L = list(itertools.permutations(np.arange(x), 4))
for ll in L:
if ll[::-1] in L:
L.remove(ll[::-1])
所用时间随着 x 的增加呈指数增长。因此,如果 x 很大,这需要很长时间!如何加快速度?
【问题讨论】:
-
在循环浏览列表时从列表中删除内容是个坏主意。
-
您是否删除
(3, 2, 1, 0)而不是(0, 1, 2, 3)仅仅是因为后者先出现? -
删除哪个并不重要
-
但在您的示例代码中,您正在创建一个包含 x permute 4 元素的列表。这等于 x*(x-1)*(x-2)*(x-3)。这是一个 4 阶多项式,本质上增长非常快—— O(x^4)。例如,如果 x = 100,则 L 包含近 1 亿个元素。当然,使用这个例子你的代码会很慢。
-
那么你要做什么就不清楚了。你的代码并不慢是因为你的算法,你的代码很慢是因为它必须创建你选择的巨大的示例列表。但是你把问题说成好像列表可以是任何东西一样?