2012-04-14 15 views
8

Ho un list di circa 40 voci. E spesso desidero aggiungere un elemento all'inizio della lista (con ID 0) e voglio delete la voce last (con id 40) della lista.Aggiungi voce all'elenco e rimuovi il primo in Python

come faccio a fare questo il meglio?

like: (esempio con 5 voci)

[0] = "herp" 
    [1] = "derp" 
    [2] = "blah" 
    [3] = "what" 
    [4] = "da..." 

dopo aver aggiunto "wuggah" ed eliminando ultimo dovrebbe essere come:

[0] = "wuggah" 
    [1] = "herp" 
    [2] = "derp" 
    [3] = "blah" 
    [4] = "what" 

o aggiungendo uno e l'eliminazione prima.

E non voglio finire manualmente spostandoli uno dopo l'altro tutte le voci al prossimo id.

+0

suggerisco si ricerca un po 'più prima di pubblicare .. La risposta è letteralmente su ogni prima pagina di introduzione alle liste. – Mellkor

+2

"E non voglio finire manualmente spostandoli uno dopo l'altro tutte le voci al prossimo id." Internamente, un oggetto list alloca una lista più grande della dimensione della lista attualmente utilizzata (10 elementi, ma la lista è in realtà molto più grande di quella). Quindi dietro la scena si sta facendo tutto questo per te - questo ha ammortizzato il tempo di esecuzione dell'inserimento, il pop in una posizione particolare e l'altro funziona il più basso possibile. http://wiki.python.org/moin/TimeComplexity – CppLearner

risposta

7

Uso collections.deque:

>>> import collections 
>>> q = collections.deque(["herp", "derp", "blah", "what", "da.."]) 
>>> q.appendleft('wuggah') 
>>> q.pop() 
'da..' 
>>> q 
deque(['wuggah', 'herp', 'derp', 'blah', 'what']) 
+0

Grazie. È lo stesso di 'myList.insert (0," wuggah ")'? –

+2

@wagglewax Sì, tranne che è un'operazione O (1) anziché O (n). –

10

Usa insert() per posizionare un elemento all'inizio della lista:

myList.insert(0, "wuggah") 

Usa pop() rimuovere e restituire un elemento nell'elenco. Pop senza argomenti si apre l'ultimo elemento nell'elenco

myList.pop() #removes and returns "da..." 
4

Usa collections.deque

In [21]: from collections import deque 

In [22]: d = deque([], 3) 

In [24]: for c in '12345678': 
    ....:  d.appendleft(c) 
    ....:  print d 
    ....: 
deque(['1'], maxlen=3) 
deque(['2', '1'], maxlen=3) 
deque(['3', '2', '1'], maxlen=3) 
deque(['4', '3', '2'], maxlen=3) 
deque(['5', '4', '3'], maxlen=3) 
deque(['6', '5', '4'], maxlen=3) 
deque(['7', '6', '5'], maxlen=3) 
deque(['8', '7', '6'], maxlen=3) 
+1

L'uso della lunghezza massima è una soluzione migliore qui, più elegante, che detto, l'OP voleva anteporre l'oggetto, non accodarlo - vuoi '' deque.appendleft() ''. Modificato. –

1

Ecco una battuta, ma probabilmente non è così efficace come alcuni degli altri ...

myList=["wuggah"] + myList[:-1] 

si noti inoltre che si crea un nuovo elenco, che non può essere quello che vuoi ...

1

Un altro approccio

L = ["herp", "derp", "blah", "what", "da..."] 

L[:0]= ["wuggah"] 
L.pop()    
Problemi correlati