Ich bin ein Anfänger in der Python-Codierung und habe versucht, diese Übung durchzuführen, um alle benachbarten Zeichen mit dem folgenden Codeblock aus einer Liste von Ganzzahlen zu einem einzelnen Element zu entfernen:

#nums is a list of integers with repeating adjacent characters. For eg. [1,2,2,2,3,3]

length = len(nums)
for i in range(length):
    while nums[i] == nums[i+1]:
            del(nums[i+1])
            length-=1

Ich erhalte immer wieder den Listenindex außerhalb des Bereichsfehlers in der while-Schleife, aber da keine der Schleifen direkt von den Indizes der Zahlen abhängt, wie verletze ich dann die Grenzen der Liste?

Ich habe zuvor mit anderen Antworten auf dasselbe Problem nachgefragt, die alle Lösungen für das Listenverständnis haben, die ich nicht auf meinen Code anwenden möchte. Ich kenne auch andere Ansätze zum Entfernen benachbarter Elemente, möchte aber wissen, was mit meinem Code hier zu Lernzwecken nicht stimmte. Danke im Voraus.

0
Pranav Abraham 19 Apr. 2018 im 11:57

4 Antworten

Beste Antwort

Ich habe einen Scheck zur Bestätigung der Länge hinzugefügt. Ist das was du willst? Die Schleife wird einfach ausgeführt, wenn Elemente verfügbar sind.

nums = [1, 2, 2, 2, 3, 3]

length = len(nums)
for i in range(length):
    while i < length-1 and nums[i] == nums[i + 1] :
        del (nums[i + 1])
        length -= 1

print(nums)
0
prms 19 Apr. 2018 im 09:06

(Python 3.6) Wenn Sie alle Duplikate entfernen und die Reihenfolge beibehalten möchten:

 >>> a = [1, 1, 2, 2, 2, 3, 4, 6, 3 ]
 >>> list(dict.fromkeys(a))
 [1, 2, 3, 4, 6]

Aber es werden auch die letzten 3 entfernt.

0
Benjámin Gerván 19 Apr. 2018 im 09:12

Hier gibt es 2 Fehler.

  1. Sie iterieren über einen Bereich, der nicht indiziert werden kann. In diesem Fall existiert das nums[len(nums)] nicht. Denken Sie daran, dass die Python-Indizierung bei 0 beginnt.
  2. Sie ändern Ihre Liste während der Iteration. Tun Sie dies nicht, da sich die Länge Ihrer Liste ändert und Ihre Iteration nicht wie beabsichtigt funktioniert.

Hier ist ein Code, der funktioniert:

nums = [1,2,2,2,3,3]
length = len(nums)

items = []
for i in range(length-1):
    if nums[i] == nums[i+1]:
        items.append(i+1)

res = [i for i, j in enumerate(nums) if i not in items]

# [1, 2, 3]
0
jpp 19 Apr. 2018 im 09:09

Sie können das Array von Ende zu Anfang mit length-1 wie folgt verfolgen:

nums = [1,2,2,2,3,3]
length = len(nums)
for i in reversed(range(length-1)):
    while (nums[i] == nums[i-1]):
        del(nums[i])

print(nums)
0
Yashar Aliabbasi 19 Apr. 2018 im 09:20