2013-07-28 14 views
222

Mam liczbę całkowitą i listę. Chciałbym utworzyć nową listę zaczynającą się od zmiennej i kończącą na liście. Pisanie a + list Dostaję błędy. Kompilator obsługuje a jako liczbę całkowitą, więc nie mogę używać rozszerzenia lub rozszerzać. Jak to zrobić?Dodawanie liczby całkowitej do początku listy w Pythonie

Odpowiedz

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

Właśnie zrobiłem kilka badań porównawczych. 'li.insert (0, a)' jest około 5 razy szybsze niż 'li = [a] + li'. Miej to na uwadze, jeśli robisz to wiele razy. –

+47

@MarcelPfeiffer Należy zauważyć, że 'li.insert (0, a)' mutuje 'li'. 'li = [a] + li' tworzy nową instancję wszystkie wartości. Jest to ważne rozróżnienie, jeśli inne rzeczy mają odniesienie do instancji listy. – unholysampler

+1

Byłoby miło dla Pythona dodać funkcję list.push_front (element). Będzie to oczywiste i mniej podatne na błędy. –

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

Jak to działa:

array.insert(index, value)

wstawić element w danym położeniu. Pierwszym argumentem jest indeks elementu, przed którym należy wstawić, więc array.insert(0, x) wstawia z przodu listy, a array.insert(len(array), x) jest równoważne. Negatywne wartości są traktowane jako odnoszące się do końca tablicy.

+5

Najbardziej efektywne podejście. Szybsza niż [x] + [y]. Zobacz rozwiązania tutaj: http://stackoverflow.com/questions/8537916/whats-the-idiomatic-syntax- for-prepending-to-a-short-python-list –

+0

Pytanie jasno stwierdza, że ​​należy utworzyć _new_ listę. Może to być szybkie, ale błędne. ;-) – BlackJack

+0

@BlackJack Pytanie dotyczy sposobu dodania liczby całkowitej do początku listy. Cokolwiek opisał, nie jest właściwe. Więc po co mu kierować, by podążał niewłaściwą ścieżką? kiedy są lepsze rzeczy, które może zrobić dla swoich wymagań. – Nullify

29

Innym sposobem robi to samo,

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

Nie potrzebujesz pierwszego 0. Okrężnica już mówi, że to przed startem - my_list [: 0] = [a] robi to. –

+0

Eleganckie rozwiązanie! – Shejo284

47

Zauważ, że jeśli staramy się robić tej operacji często, zwłaszcza w pętli, lista jest niewłaściwa struktura danych.

Listy nie są zoptymalizowane dla modyfikacji z przodu, a somelist.insert(0, something) to O(n) operation.

somelist.pop(0) i del somelist[0] są również operacjami O (n).

Poprawną strukturą danych do użycia jest deque z modułu collections. deques ujawniają interfejs podobny do tych z list, ale są zoptymalizowane pod kątem modyfikacji z obu punktów końcowych. Mają one metodę wstawiania z przodu appendleft.

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 
Powiązane problemy