2012-04-10 18 views
9

Ich habe eine einfache, immer aufeinanderfolgende geordnete Liste wie folgt aus:Wie entferne ich einen Bereich (Unterabschnitt) einer Liste in Python?

all = [ 1, 2, 3, 4, 5, 6 ] # same as range(1, 7) 

Ich habe auch current = 4. Am Ende möchte ich die all Liste wie diese So

altered = [ 1, 2, 5, 6 ] 

schauen, was passiert ist, war es die current Zahl und derjenige, bevor es3 entfernt.

current kann auch 1 und 0 sein, also möchte ich sicherstellen, dass es keinen Fehler für diese beiden Werte wirft.

Für die Ausnahme current = 0 ist die geänderte Liste wie diese

altered = [ 1, 2, 3, 4, 5 ] 

was bedeutet, dass current = 0 einfach die letzte Nummer entfernt.

Ich fühle mich wie Sie können wahrscheinlich etwas Phantasie mit Generatoren codieren, aber ich bin scheiße beim Schreiben sie.

Vielen Dank im Voraus!

Bonuspunkte dafür in einer Zeile. Wenn der current = 0 zu viel Mühe ist, dann könnte es auch current = -1 oder current = 7 sein.

EDIT: Stellen Sie sicher, für current = 1 zu überprüfen, die

altered = [ 2, 3, 4, 5, 6 ] 
+0

Wenn Strom == 4 die 4 aus der Liste entfernt ist, weil es den Wert 4 hat, oder weil es in der vierten Position ist (wenn man von einem Zählen)? Wird die 3 ebenfalls entfernt, weil es sich um die kleinste Zahl unter 4 handelt oder weil sie sich auf dem Index vor dem entfernten Objekt befindet? – thebjorn

+0

Die Liste ist immer ein 'range()', also ist es egal, ob Sie es als Position oder Wert betrachten. – hobbes3

+2

Nennen Sie Ihre Listen nicht "all", da es eine integrierte Funktion 'all()' gibt, die den Zugriff darauf löscht, sobald Sie den Namen verwendet haben. – jamylak

Antwort

9
all = all[:max(current - 2, 0)] + all[current:] 

oder

del all[max(current - 2, 0):current] 
+0

Funktioniert nicht für 'current = 1' – hobbes3

+0

funktioniert es jetzt? – Doboy

+0

Schön! Dies funktioniert auch für "current = 7". Ist es möglich, die letzte Zahl für 'current = 0' zu löschen? Dann wird es perfekt sein! – hobbes3

1

Würde diese Arbeit sein sollte?

>>> all = range(1, 7) 
>>> new = all[:2]+all[4:] 
>>> print new 
[1, 2, 5, 6] 
0
>>> all = range(1,7) 
>>> current = 4 
>>> [item for item in all if item != current and item != current-1] 
[1, 2, 5, 6] 
>>> current = 0 
>>> [item for item in all if item != current and item != current-1] 
[1, 2, 3, 4, 5, 6] 
+0

BTW Damit bleibt die ursprüngliche Liste unverändert. – huggie

+1

'current = 0' muss den Endwert' 6' entfernen als ** hobbes3 ** erwähnt – FallenAngel

+0

Ich denke, das sollte funktionieren, aber es gilt nicht für 'current = 0' :-(' [item für item in all wenn item! = current und item! = current-1 oder current == 0 und item!= len (alle)] ' – hobbes3

1
all[:max(current-2,0)] + all[max(current,0):][:-1] + all[-1:]*(0 < current < len(all)) 
Verwandte Themen