wake-up-neo.net

Platzieren Sie mehrere Elemente am Anfang und Ende einer Liste

Angenommen, ich habe eine Liste mit folgenden Elementen:

mylist=['a','b','c','d','e','f','g','h','i']

Ich möchte zwei Elemente von links (d. H. a und b) und zwei Elemente von rechts (d. H. h, i) platzieren. Ich möchte, dass prägnant ein sauberer Weg ist, dies zu tun. Ich könnte es so machen:

for x in range(2):
    mylist.pop()
    mylist.pop(0)

Irgendwelche anderen Alternativen?

18
ehsan88

Aus Sicht der Leistung:

  • mylist = mylist[2:-2] und del mylist[:2];del mylist[-2:] sind gleichwertig
  • sie sind etwa dreimal schneller als die erste Lösung for _ in range(2): mylist.pop(0); mylist.pop()

Code

iterations = 1000000
print timeit.timeit('''mylist=range(9)\nfor _ in range(2): mylist.pop(0); mylist.pop()''', number=iterations)/iterations
print timeit.timeit('''mylist=range(9)\nmylist = mylist[2:-2]''', number=iterations)/iterations
print timeit.timeit('''mylist=range(9)\ndel mylist[:2];del mylist[-2:]''', number=iterations)/iterations

Ausgabe

1.07710313797e-06

3.44465017319d-07

3.49956989288d-07

17
bold

Sie könnten eine neue Liste ausschneiden und die alte Liste so beibehalten, wie sie ist:

mylist=['a','b','c','d','e','f','g','h','i']
newlist = mylist[2:-2]

newlist gibt jetzt zurück:

['c', 'd', 'e', 'f', 'g']

Sie können den Verweis auch auf die alte Liste überschreiben:

mylist = mylist[2:-2]

Beide oben genannten Ansätze benötigen mehr Speicher als die unten aufgeführten.

Was Sie versuchen, sich selbst zu tun, ist speicherfreundlich, mit dem Nachteil, dass Ihre alte Liste verändert wird, popleft ist jedoch nicht für Listen in Python verfügbar, sondern eine Methode des collections.deque-Objekts.

Das funktioniert gut in Python 3:

for x in range(2):
    mylist.pop(0)
    mylist.pop()

Verwenden Sie in Python 2 nur Xrange und Pop:

for _ in xrange(2):
    mylist.pop(0)
    mylist.pop()

Der schnellste Weg zum Löschen, wie Martijn vorschlägt (dies löscht nur den Verweis der Liste auf die Elemente, nicht notwendigerweise die Elemente selbst):

del mylist[:2]
del mylist[-2:]
10
Aaron Hall

Wenn Sie die Werte nicht beibehalten möchten, können Sie die Indizes löschen:

del myList[-2:], myList[:2]

Dies setzt jedoch voraus, dass alle verbleibenden Elemente zu den Stellen in der Liste verschoben werden. Dies erfordert auch zwei .popleft()-Aufrufe, aber das list-Objekt kann jetzt die Bewegungen in einem Schritt verarbeiten.

Es wird kein neues Listenobjekt erstellt.

Demo:

>>> myList = ['a','b','c','d','e','f','g','h','i']
>>> del myList[-2:], myList[:2]
>>> myList
['c', 'd', 'e', 'f', 'g']

Aufgrund Ihrer Verwendung von popleft vermute ich jedoch stark, dass Sie stattdessen mit einem collections.dequeue() object arbeiten. Wenn ja, verwenden Sie popleft(), da dies weitaus effizienter ist als das Schneiden oder del für ein Listenobjekt.

7
Martijn Pieters

Erste 2 Elemente: myList[:2]
Letzte 2 Elemente: mylist[-2:]

Also myList[2:-2]

2
zer0uno

Python3 hat etwas Cooles, ähnlich wie Rest in JS (aber ein Schmerz, wenn Sie eine Menge Sachen herausspringen müssen)

mylist=['a','b','c','d','e','f','g','h','i']
_, _, *mylist, _, _ = mylist
mylist == ['c', 'd', 'e', 'f', 'g']  # true
0
mastercoder8