2017-08-31 17 views
2

問題

私は迷路ソルバのための幅優先探索アルゴリズムに取り組んでいます。私は、現在のスタックを追跡しています。前のスタックをコピーし、現在の値を追加します。リストの複数のコピーを作成する最速の方法

コピーリストには長い時間がかかりますので、1回の操作でリストの複数のコピーを作成したいと思います。私は、リストをコピーして複数の変数に代入し、これまで

  • を試してみた何

    copy関数(list[:]より速い)と

    l = [1, 2, 3] 
    a = b = c = l[:] # Just creates references and no individual lists 
    

  • 使用numpyのアレイ。

質問

つのリストの複数のコピーを作成するための最速の方法は何ですか?

+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

関連する問題