Zyklisch ein Array durclaufen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ihPyP
User
Beiträge: 58
Registriert: Samstag 4. September 2010, 23:06

Hallo,

ich nach einer Lösung für ein Problem. Stellt Euch einmal vor, dass ein Feld "Data" aus folgenden 6 Einträgen besteht:

Code: Alles auswählen

Data = ['0', '1', '2', '3', '4', '5']
Ich möchte nun mit Hilfe von einem StartIndex, EndIndex und einem Inkrement (+1, -1) eine neue Liste "NeuesFeld" erzeugen. Und zwar, indem ich wie folgt Data zyklisch durlaufe:

Code: Alles auswählen

StartIndex = 2
EndIndex =1
Inkrement = 1
NeusFeld = ['2','3','4','5','0','1']
Oder:

Code: Alles auswählen

StartIndex = 2
EndIndex =4
Inkrement = -1
NeusFeld = ['2', '1', '0', '5', '4']
Wie kann man das am einfachsten umsetzen? Danke im Voraus.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@ihPyP: itertools cycle und islice könnten nützlich sein, zusammen mit reverse und ein bißchen Indexumrechnung ist auch die negative Schrittweite kein Problem.
Benutzeravatar
pixewakb
User
Beiträge: 1408
Registriert: Sonntag 24. April 2011, 19:43

Ich bin gerade auf dem Sprung, aber ich hätte ab diesem Punkt noch keine anderen Bibliotheken verwendet und es mit den Standardmöglichkeiten umgesetzt.

Code: Alles auswählen

data = ['0', '1', '2', '3', '4', '5']

def basteln(startindex, endindex, inkrement=1):
    '''
    Die Funktion setzt eine Liste
    entsprechend der übergegebenen Parameter
    neu zusammen und gibt die neue Liste zurück.
    
    startindex =
    endindex   =
    inkrement  = 

    Work in progress.
    '''
    new_data = []
    # Fall 1: Inkrement ist 1
    if inkrement == 1:
        # Fall 1.1: ...
        if startindex > endindex:
            new_data.extend(data[startindex:])
            new_data.extend(data[0:endindex + 1])
        # Fall 1.2: ...
        elif startindex < endindex:
            new_data.extend(data[startindex:endindex + 1])          
    elif inkrement == -1:
        print("Nicht implementiert!")
        new_data = None

    return new_data

startindex = 2
endindex = 1 
inkrement = 1

print(basteln(startindex, endindex, inkrement))
Die Sache mit dem Inkrement -1 habe ich noch nicht berücksichtigt, ist aber m. E. auch kein Problem, d. h. nichts, was man nicht einfach lösen können sollte.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@pixewakb: programmieren heißt ja nicht, möglichst viel selbst zu schreiben, sondern möglichst einfach und schnell zum Ziel zu kommen und wenn dabei Bibliotheken helfen, dann sollte man sie auch einsetzen:

Code: Alles auswählen

>>>from itertools import cycle, islice
>>> Data = ['0', '1', '2', '3', '4', '5']
>>> list(islice(cycle(Data), 2, 8))
['2', '3', '4', '5', '0', '1']
>>> list(islice(cycle(reversed(Data)), 3, 8))
['2', '1', '0', '5', '4']
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

@pixewakb:

Wäre es nicht sinnvoller, an Stelle eines End-Index neben der Richtung die Anzahl der zu übernehmenden Listenobjekte anzugeben? Dein Beispiel 2 zeigt, dass nicht immer alle Listenobjekte übernommen werden müssen. Damit ergibt sich die Frage, ob die neue Liste auch mehr Objekte haben kann, als die Ausgangsliste.

Aus Deiner basteln() Funktion kann man zwar schließen, dass die neue Liste kleiner oder gleich, keinesfalls aber größer sein darf, als die Ausgangsliste. Durch die Angabe der Anzahl der Objekte, die zu übernehmen sind, wäre die Aufgabenstellung meiner Ansicht nach aber eindeutig.

MfG, kodela
Antworten