Python

2013-07-28 10 views
222

listesinin başına tamsayı ekle Tamsayı ve bir listeye sahibim. Değişkenle başlayan ve listeyle biten yeni bir liste yapmak istiyorum. Yazma a + list Hataları alıyorum. Derleyici, a'u tamsayı olarak işler, böylece eki kullanamıyorum ya da genişletemiyorum. Bunu nasıl yaparsınız?Python

cevap

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

Sadece biraz kıyaslama yaptı. li.insert (0, a) 'li = [a] + li''den yaklaşık 5 kat daha hızlıdır. Bunu birçok kez yapıyorsanız bunu aklınızda bulundurun. –

+47

@MarcelPfeiffer 'li.insert (0, a)' 'li' kelimesinin mutasyona uğradığına dikkat edilmelidir. li = [a] + li' tüm değerleri içerecek yeni bir örnek oluşturuyor. Diğer örneklerin liste örneğine başvurması durumunda bu önemli bir ayrımdır. – unholysampler

+1

Python'un bir list.push_front (item) işlevi eklemesi güzel olurdu. Bu açık ve daha az hata eğilimli olacaktır. –

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

Nasıl çalışır:

array.insert(index, value)

belirli bir konumda bir eleman sokar. İlk bağımsız değişken listesi ön eklemek için önce elemanın indeksi, yani array.insert(0, x) uçlar ve array.insert(len(array), x) dizinin sonuna göre olarak kabul edilir array.append(x) .Negative değerlerine eşittir.

+5

En verimli yaklaşım. [X] + [y] 'den daha hızlı. Çözümleri buraya bakın: http://stackoverflow.com/questions/8537916/whats-the-idiomatic-syntax-for-prepending-to-a-short-python-list –

+0

Soru, açıkça bir _new_ listesinin oluşturulması gerektiğini belirtir. Yani bu hızlı olabilir - ama yanlış. ;-) – BlackJack

+0

@BlackJack Sorun, listenin başlangıcına tamsayıyı eklemekle ilgili. Açıkladığı her şey, takip edilmesi gereken doğru şey değildir. Öyleyse neden yanlış yol almak için onu yönlendirmek? Onun ihtiyacı için yapabileceği daha iyi bir şey olduğunda. – Nullify

29

aynı yapmanın bir başka yolu, özellikle döngüler içinde, çoğu kez bu işlemi yapmaya çalışıyorsanız, bir liste yanlış veri yapısı olduğunu

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

İlk 0'a ihtiyacınız yok. Kolon zaten başlangıçtan önce olduğunu söylüyor - my_list [: 0] = [a] bunu yapıyor. –

+0

Zarif çözüm! – Shejo284

47

Not.

Listeleri ön modifikasyon için optimize edilmiştir ve somelist.insert(0, something) bir O(n) operation olduğu değildir.

somelist.pop(0) ve del somelist[0] da O (n) işlemlerdir.

Kullanılacak doğru veri yapısı, collections modülünden deque şeklindedir. deques, listelerinkilere benzer bir arabirim ortaya çıkarır, ancak her iki uç noktadan yapılan değişiklikler için optimize edilir. Öne eklemeleri için appendleft yöntemine sahipler.

Demo:

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