Pourquoi Python liste pas changer/annuler le décalage de méthodes?
Je me demande pourquoi la valeur par défaut list
en Python n'a pas de shift
, unshift
méthodes. Peut-être il ya une raison évidente, comme la façon dont les listes sont classées dans la mémoire.
Donc, actuellement, je sais que je peux ajouter utiliser pour ajouter un élément à la fin d'une liste et de les supprimer pour supprimer un élément. Cependant, je ne peux utiliser la liste de concaténation de immitate le comportement d'un manque shift
ou unshift
méthode.
>>>a = [1,2,3,4,5]
>>>a.append(6)
>>>a
[1,2,3,4,5,6]
>>>a.pop()
[1,2,3,4,5]
>>>a = [0] + a # Unshift /Push
>>>a
[0,1,2,3,4,5]
>>>a = a[1:] # Shift /UnPush
>>>a
[1,2,3,4,5]
Ai-je raté quelque chose?
pop(0)
, insert(0,x)
?Pourquoi? Demander aux auteurs!
Non, ceux sont par index.
Il pourrait être intéressant de noter que Python
list
type n'est en fait pas une liste chaînée, c'est un tableau. Ainsi, l'ajout d'une valeur au début de la liste est plus gourmand en ressources que pour une liste liée, et elle pourrait conduire à (encore plus) la confusion.Pour aller plus loin, Python, les listes sont des tableaux noms (essentiellement comme un tableau de pointeurs), qui est également très différente de celle d'une mémoire contiguë tableau comme dans C. En Python, l'espace alloué pour les éléments de la liste est contiguë (en général), mais les éléments de la liste peuvent être simplement des noms de point d'arrêt à toutes sortes de crazy coins de la mémoire. Souvent, si vous avez besoin d'être en effectuant des opérations qui serait efficace pour les traditionnels tableaux, cela signifie que vous devriez être à l'aide de quelque chose qui met en œuvre le protocole de mémoire, de type array.tableau NumPy ou ndarray, au lieu de la liste.
OriginalL'auteur nowox | 2015-12-10
Vous devez vous connecter pour publier un commentaire.
Python, les listes ont été optimisé pour une durée fixe et des opérations et à engager des O(n) de la mémoire des coûts de mouvement pour
pop(0)
etinsert(0, v)
opérations qui modifient à la fois la taille et la position de la sous-représentation des données. En fait, la "liste" type de données dans Disponible fonctionne différemment de ce que beaucoup d'autres langues pourrait appeler une liste (par exemple, une liste liée) - il est mis en œuvre plus de la même façon à ce que d'autres langues pourrait appeler un tableau, mais il ya quelques différences ici aussi.Vous pouvez être intéressé à la place de
collections.deque
, qui est une forme de liste conteneur rapide ajoute et saute sur les deux extrémités.Deques soutien thread-safe, efficace en terme de mémoire ajoute et pop de chaque côté de la deque avec environ la même O(1) de la performance dans les deux sens. Le manque de méthodes vous avez l'air de se demander sont fournis sous les noms
appendleft
etpopleft
:Bien sûr, il est un compromis, et de l'indexation ou de l'insertion ou du retrait près de la milieu de la deque est lente. En fait
deque.insert(index, object)
n'était même pas possible avant de Python 3.5, vous devez faire tourner, d'insérer/pop, et de tourner en arrière. Vous perdez également le découpage, donc si vous avez besoin de ce que vous aurez à écrire quelque chose de gênant avec, par exemple,itertools.islice
à la place.Pour plus de détails sur les avantages et les inconvénients de
deque
vslist
structures de données, voir Comment sont deques en Python mis en œuvre, et, quand ils sont pire que les listes?OriginalL'auteur wim