21

あなたが持っている

x = ['a', 'b', 'c']
y = [1, 2, 3]

yそして、の先頭にリストを挿入したいx:

x = [1, 2, 3, 'a', 'b', 'c']

Pythonでこれを行うための最適なソリューションは何ですか?

4

4 に答える 4

30
>>> x = ['a', 'b', 'c']
>>> y = [1, 2, 3]
>>> x = y + x

dequeこの単純なソリューションは、入力サイズが小さい場合のソリューションの 2 倍の速度で実行されます。

$ cat x1.py 
for i in range(1000000):
    x = ['a', 'b', 'c']
    y = [1, 2, 3]
    x = y + x

$ cat x2.py 
from collections import deque
for i in range(1000000):
    d = deque(['a', 'b', 'c'])
    d.extendleft(reversed([1, 2, 3]))

$ time python x1.py

real    0m1.912s
user    0m1.864s
sys     0m0.040s

$ time python x2.py

real    0m5.368s
user    0m5.316s
sys     0m0.052s

ただし、入力のサイズが大きくなると遅くなります。

>python -m timeit -s "y = range(100000)" "x = list(xrange(10000000)); y+x"
10 loops, best of 3: 229 msec per loop

>python -m timeit -s "from collections import deque; y = range(100000)" "d = deque(xrange(10000000)); d.extendleft(reversed(y))"
10 loops, best of 3: 178 msec per loop
于 2012-06-19T10:20:38.963 に答える
18

左に追加したい場合dequeは、リストよりも a の方がはるかに効率的です。メソッドを使用しextendleftます。

>>> from collections import deque
>>> d = deque(['a', 'b', 'c'])
>>> d.extendleft(reversed([1, 2, 3]))
>>> d
deque([1, 2, 3, 'a', 'b', 'c'])

常に左のみに追加する場合は、リスト内の要素を逆の順序で保持することを検討してください。

于 2012-06-19T10:11:35.347 に答える
10

結果に対して何をしているかにもよりますが、おそらくリストをまったく作成したくないでしょう:

new_x = itertools.chain(y, x)

これで、y のすべての値を生成し、次に x のすべての値を生成する反復子ができました。今、あなたはそれを繰り返すことができます:

for val in new_x:
    blah blah
于 2012-06-19T11:56:38.490 に答える