2016-11-30 8 views
0

Würden Sie mir bitte bei diesem Problem helfen? Ich habe ein Array wie dieseÜberspringendes Element in einer Liste

a = [1,2,3,0,0,0,3,4,5] 

und ich möchte die Ausgabe

a = [1,2,3,0,0,0,4,5,6] 

oder a = [1,2,3,0,3,4,5] -> a = [1,2,3,0,4,5,6]

So sein, ich weiß, wie Duplikat zu erkennen und Nummer in der Liste zu erhöhen. Aber mein Problem ist, wie kann ich 0 erkennen und es in meiner Iteration durch die Liste "überspringen"? Jede Hilfe ist willkommen (Python 2.7 ist ideal, da wir 2.7 verwenden)

mein Weg so weit ist

i = 1 
while i < len(a): 
    if a[i-1] == a[i]: 
     a[i] = a[i]+1 
i = i+1 

und natürlich funktioniert es nur, wenn a = [1,2,3,3,4,5]

Dank für Ihre Zeit danken.

+0

Was hast du versucht? – Akavall

+3

Sie haben nicht genügend Informationen über den Algorithmus bereitgestellt, inkrementieren Sie basierend auf der "0", z. wird "[1,2,0,3,4]" zu "[1,2,0,4,5]" oder erhöht sich aufgrund des Duplikats "3" (ohne "0"), z. "[1,2,3,3,4]" wird zu [1,2,3,4,5]. Und Sie haben keinen Versuch von Ihrer Seite gezeigt. – AChampion

+0

Nein, es ist genug. Da habe ich nur die Fälle [1,2,3,0,4,5] oder [1,2,3,0,0,4,5]. Und es wird "immer" so in meiner Umgebung sein. – Alexander

Antwort

2
  • einen Hilfssatz definieren zu testen, ob Element
  • Sonderfall bereits verwendet wurde: Bei 0-Pass-Through
  • die ursprüngliche Liste zu scannen, und eine Erhöhung von 1 bis nicht in aux eingestellt
  • fügen Sie den neuen Wert auf den eingestellten
  • zur Ausgabeliste anhängen

(keine Liste Verständnis hier, da ein Nebeneffekt gibt es)

mein Vorschlag:

a = [1,2,3,0,0,0,3,4,5] 
b = [] 
s = set() 

for i in a: 
    if i: 
     while i in s: 
      i+=1 
     s.add(i) 
    b.append(i) 

Hinweis: abhängig von den Daten kann die set zu viel des Guten. Wenn Sie nur Datenteile zu erhöhen haben (mit Ausnahme der Null) 1 Speicher-Slot genug sein sollte:

a = [1,2,3,0,0,0,3,4,5] 
b = [] 

highest = 0 
for i in a: 
    if i!=0: 
     if i <= highest: 
      i=highest+1 
     highest = i 
    b.append(i) 

(was schneller ist, weil es nicht i nicht erhöht, nimmt nur den höchsten Wert + 1)

+0

es funktioniert. Ich benutzte die Iteration durch die Liste und verglich a [i-1] und a [i] und setzte dann [i] = a [i] +1. Auf diese Weise wird nur dupliziert, aber nicht übersprungen. Vielen Dank für die Hilfe. – Alexander

+0

Wenn die Listenteile in aufsteigender Reihenfolge sortiert sind, mit Ausnahme von Nullen, könnten Sie es einfacher machen, indem Sie sich das letzte Nicht-Null-Element merken (keine Notwendigkeit für einen 'Satz'). –

Verwandte Themen