2013-07-28 17 views
222

私は整数とリストを持っています。変数で始まりリストで終わる新しいリストを作成したいと思います。 書くa + list私はエラーが発生します。コンパイラはaを整数として扱うので、appendを使うことも、extendすることもできません。 どうすればよいですか?どのように動作するPythonでリストの先頭に整数を追加する

答えて

308
>>> a = 5 
>>> li = [1, 2, 3] 
>>> [a] + li # Don't use 'list' as variable name. 
[5, 1, 2, 3] 
+199

私はいくつかのベンチマークを行いました。 'li.insert(0、a)'は 'li = [a] + li'より約5倍高速です。これを何度もやっているなら、これを覚えておいてください。 –

+47

@MarcelPfeiffer 'li.insert(0、a)'は 'li'を変形していることに注意してください。 'li = [a] + li'はすべての値を新しいインスタンスに作成します。これは、他のものがリストインスタンスへの参照を持つ場合、重要な区別です。 – unholysampler

+1

pythonでlist.push_front(item)関数を追加するといいでしょう。これは明らかになり、エラーを起こしにくくなります。 –

330
>>>var=7 
>>>array = [1,2,3,4,5,6] 
>>>array.insert(0,var) 
>>>array 
[7, 1, 2, 3, 4, 5, 6] 

array.insert(index, value)

は、所定の位置に項目を挿入します。最初の引数は、挿入する前の要素のインデックスです。はリストの先頭に挿入され、array.insert(len(array), x)array.append(x)と等価です。負の値は配列の末尾からの相対値として扱われます。

+5

最も効率的なアプローチ。 [x] + [y]よりも速い。こちらのソリューションを参照してください:http://stackoverflow.com/questions/8537916/whats-the-idiomatic-syntax-for-prepending-to-a-short-python-list –

+0

質問には_new_リストを作成する必要があります。これは速いかもしれませんが、間違っています。 ;-) – BlackJack

+0

@BlackJack質問は、リストの先頭に整数を追加する方法です。彼が何を描いてもそれは正しいことではありません。それで彼が間違った道を取るように案内する理由は何ですか?彼が彼の必要条件を満たすことができるより良いことがあるとき。 – Nullify

29

同じことを別の方法、あなたは特にループで、多くの場合、その操作をしようとしている場合は、リストは間違ったデータ構造であることを

list[0:0] = [a] 
+16

最初の0は必要ありません。コロンはすでに開始前であると言っています - my_list [:0] = [a]はそれを行います。 –

+0

エレガントなソリューション! – Shejo284

47

注意。

リストは修正のために最適化されておらず、somelist.insert(0, something)O(n) operationです。

somelist.pop(0)およびdel somelist[0]もO(n)操作です。

使用する正しいデータ構造はcollectionsモジュールのdequeです。 dequesは、リストと似ているが両方のエンドポイントからの変更に最適化されたインターフェースを公開します。彼らは前面に挿入する方法がappendleftです。

デモ:

In [1]: lst = [0]*1000 
In [2]: timeit -n1000 lst.insert(0, 1) 
1000 loops, best of 3: 794 ns per loop 
In [3]: from collections import deque 
In [4]: deq = deque([0]*1000) 
In [5]: timeit -n1000 deq.appendleft(1) 
1000 loops, best of 3: 73 ns per loop