2017-08-31 75 views
2

问题

我正在为我的迷宫求解器开发一个广度优先搜索算法,并且它工作至今。我通过复制前一个并追加当前值来跟踪当前堆栈。创建列表的多个副本的最快方法

由于复制列表需要大量的时间,我想在一个操作中创建列表的多个副本。

我到目前为止已经

  • 复制列表尝试,并将其分配给多个变量。

    l = [1, 2, 3] 
    a = b = c = l[:] # Just creates references and no individual lists 
    
  • 使用numpy的阵列,copy功能(除了list[:]更快)。

问题

什么是创建一个列表的多个副本最快的方法?

+0

你真的需要清单吗?我通常会为这样的应用程序寻找[意大利面条堆栈](https://en.wikipedia.org/wiki/Parent_pointer_tree),并且只有在找到目标后才创建列表,如果我需要列表。 – user2357112

+0

你正在使用'l [:]',所以我假设你想要一个浅拷贝? – stybl

+0

@ user2357112我不需要列表。我将使用哪种数据结构来保存这样的堆栈?一本字典? – jsmolka

回答

5

不要使用普通的Python列表为您的堆栈。使用Lisp风格链接的列表,让您的堆栈分享他们的大部分彼此和建设有一个额外的元素的新的堆栈结构的恒定时间:

def empty_stack(): 
    return() 
def push(stack, item): 
    return (item, stack) 
def stack_to_list(stack): 
    l = [] 
    while stack: 
     item, stack = stack 
     l.append(item) 
    return l[::-1] 

这里,push运行在固定时间,并产生一个新的堆栈,而不会突变旧的,因此您可以在旧堆栈上重复调用push而不复制它。

+1

我可以问一下,这是什么?你是用python建模一个栈吗? –

+2

@cᴏʟᴅsᴘᴇᴇᴅ:这是一个堆栈实现,其中一个空栈由一个空元组表示,而一个非空栈表示为'(顶部项目,包含其余项目的栈)'对。如果您有功能语言方面的经验,可能会更熟悉;在一些功能语言中,它甚至是语言的核心数据结构。 – user2357112

0

你可以只批量复制它:

def copyList(thelist, number_of_copies): 
    return tuple(thelist[:] for _ in xrange(number_of_copies)) 

a, b, c = copyList(range(10), 3) 

这里有一个live example

+0

如果您放置3个以上的副本,则这不起作用。 –

+0

@Avión,如果你使用更多的方法,你可以捕获变量中的元组中的所有副本,或者使用更多的变量进行解压缩,这是因为拆包而引起的。 – Netwave

相关问题