Warum Python-Liste keine shift/unshift Methoden?
Frage ich mich, warum der Standard - list
in Python keine shift
, unshift
Methoden. Vielleicht gibt es einen offensichtlichen Grund dafür mag die Art, die Listen sind geordnet im Speicher.
Also aktuell weiß ich, dass ich verwenden können, fügen Sie zum hinzufügen eines Elements am Ende einer Liste und löschen zum entfernen eines Elements. Allerdings kann ich nur verwenden Liste Verkettung immitate die das Verhalten eines fehlenden shift
oder unshift
Methode.
>>>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]
Hab ich was verpasst?
pop(0)
,insert(0,x)
?- Warum? Fragen Sie den Autoren!
- Demonstrieren Sie mit diesem code, können Sie einfach shift und unshift ohne spezielle Methoden?
- Ich denke, er wird gefragt, vielleicht ein software-DEU Perspektive, warum bestimmte Vorgänge nicht Ihre logische Gegensätze.
- Nicht wirklich, weil Sie auf Ihrer Liste nach dem Wert, nicht nach dem index 🙁
- Nein, diejenigen sind, die durch den index.
- Gut, mit slice, den Sie erhalten, die gleiche Sache, nicht wahr?
shift left by 2 : a = a[2:]+a[:2]
,shift right by 2 : a = a[-2:]+a[:-2]
. Oder ist das nicht das, was Sie gefragt? - Es mag auch erwähnenswert sein, dass Python ' s
list
geben Sie nicht tatsächlich eine verknüpfte Liste, es ist ein array. So, beim hinzufügen eines Werts am Anfang der Liste ist rechnerisch teuer als für einen regulären verknüpften Liste, und es könnte führen zu (noch mehr) Verwirrung. - Weiter zu gehen, Python Listen sind arrays von Namen (im Prinzip wie ein array von Zeigern), die ist auch ganz anders als einen zusammenhängenden Speicher-Arrays wie in C, In Python, der Speicherplatz für die Listenelemente ist zusammenhängend (in der Regel), aber die Liste der Elemente selbst können nur Namen von diesem Punkt aus zu allen möglichen verrückten Winkeln des Gedächtnisses. Oft, wenn Sie tun müssen Operationen, die wäre effizienter für die traditionellen arrays, bedeutet das, Sie sollten mit etwas implementiert, dass die buffer " - Protokolls, wie array.array oder ndarray NumPy, statt der Liste.
- Aber perl lösten das problem, indem Sie die Liste in der Mitte des Arrays, so dass unshifting und schieben nehmen Sie die gleiche Menge an Zeit (wie lange, wie Sie tun es nicht so viel, dass Sie eine neue array). Aber diese Art von Fragen, die in der Regel einkochen "Fragen die Autoren".
- Es wird ein wenig schwierig, wenn man einen kleinen integer oder ein interniert string in eine Liste, da dann der Eintrag in der Liste, sagen my_list ein[i] ist ein name, der bezieht sich auf eine singuläre Entität repräsentiert den Wert. Aber für größere Ganzzahlen und un-strings interniert, kann es sein, dass der einzige name, den es in einem bestimmten Programm für die Entität wird der name "my_list ein[i]", welche Art von tricks, die Sie in dem glauben, dass das Objekt sozusagen "Leben" in der Liste der reservierten Arbeitsspeicher, aber eigentlich nur ein name für Sie lebt in der Liste.
- warum nicht einfach
def popfirst(l): l.reverse() l.pop() l.reverse() return l
InformationsquelleAutor nowox | 2015-12-10
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Python Listen wurden optimiert für schnelles fester Länge-Operationen und O(n) Speicher-Bewegung Kosten für
pop(0)
undinsert(0, v)
Operationen, die das ändern der Größe und position der zugrunde liegenden Daten-Darstellung. Eigentlich ist die "Liste" Datentyp in CPython anders funktioniert, als zu dem, was viele andere Sprachen nennen könnte, eine Liste (z.B. eine verkettete Liste) - umgesetzt wird es mehr ähnlich zu dem, was andere Sprachen nennen könnte, eine array, aber es gibt einige Unterschiede auch hier.Die Sie interessieren können, statt in
Sammlungen.deque
, die einen list-container mit schnell angehängt und erscheint an beiden enden.Deques support thread-sichere, effiziente Speicher hängt und knallt aus beiden Seiten der deque mit etwa der gleichen O(1) Leistung in beide Richtungen. Die fehlenden Methoden, die Sie zu sein scheinen zu Fragen, sind unter dem Namen
appendleft
undpopleft
:Natürlich, es ist ein trade-off, und die Indizierung oder das einfügen/entfernen in der Nähe des Mitte der deque ist langsam. In der Tat
deque.insert(index, object)
war nicht einmal möglich vor Python 3.5, würden Sie brauchen, zu drehen, einfügen/pop und wieder zurück drehen. Verlieren Sie auch aufschneiden, so dass, wenn Sie notwendig, dass Sie haben, etwas zu schreiben, nervt mit z.B.itertools.islice
statt.Für die weitere Diskussion der vor-und Nachteile von
deque
vslist
Datenstrukturen, siehe Wie sind deques in Python umgesetzt, und Wann sind Sie schlimmer als Listen?