2011-09-11 11 views
18

リストのバージョンを実装する最も無慈悲な方法を探しています。extend関数リスト。リストにインデックスを追加するには、リスト要素を最後まで挿入するだけでなく、

a_list = [ "I", "rad", "list" ]              
b_list = [ "am", "a" ] 
a_list.my_extend(b_list, 1) # insert the items from b_list into a_list at index 1 

print(a_list) # would output: ['I', 'am', 'a', 'rad', 'list'] 

このような新しいリストを作成することなくこれを行う方法はありますか?

a_list = [ "I", "rad", "list" ] 
b_list = [ "am", "a" ] 
c_list = [] 

c_list.extend(a_list[:1]) 
c_list.extend(b_list ) 
c_list.extend(a_list[1:]) 

print(c_list) # outputs: ['I', 'am', 'a', 'rad', 'list'] 

このアプローチは実際にはそれほど悪くはありませんが、私はそれが簡単かもしれません。それはできますか?

+2

新しいリストを作成するのに間違いはありませんが、なぜそれをステップで実行していますか?それよりずっと簡単です: 'c_list = a_list [:1] + b_list + a_list [1:]'。 –

+0

私は+リストのために過負荷されていたか分からなかった。 – mwcz

+0

私は同じことが必要でしたが、代わりに、 'insert'が' unpacked 'リスト要素を 'extend'と同様の方法でインデックスに追加する振る舞いをする方法について質問しました。答えは同じでした:-D – danicotra

答えて

41

確かに、あなたはスライスのインデックスを使用することができます:あなたは架空のカスタムlistクラスでmy_extend機能を実装した場合

a_list[1:1] = b_list 

ちょうど、一般的なアルゴリズムを示すために、それは次のようになります。

def my_extend(self, other_list, index): 
    self[index:index] = other_list 

しかし、実際にはそれを関数にしないでください。必要なときにスライス表記を使用してください。

+0

ハ、私はそれを知っていた!私はそれを試みることは決して考えなかった。私は 'b_list'の要素ではなく、インデックス1に' b_list'全体を 'a_list'に配置すると仮定しました。私は明らかにスライスの複雑さを見直す必要があります。どうもありがとう。 – mwcz

+2

私はこの解決策が気に入っていますが、Pythonの原則とは少し違っていますが、何が起こるのかはすぐに分かりません(あなたのせいではありません)。むしろ拡張のためのオプションの議論があったと思う... – Stan

+2

私は知っている、私は表記をスライスするために慣れれば十分明らかだと思います。うまくいけば、the_list [i:j] = other_listは 'i j'というケースについて話していたのであれば、直感的に何が起こるべきか分かりませんが、とにかく動作します。 –

関連する問題