Seite 1 von 1

Zyklisch ein Array durclaufen

Verfasst: Donnerstag 24. Dezember 2015, 23:25
von ihPyP
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.

Re: Zyklisch ein Array durclaufen

Verfasst: Freitag 25. Dezember 2015, 09:55
von Sirius3
@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.

Re: Zyklisch ein Array durclaufen

Verfasst: Freitag 25. Dezember 2015, 11:35
von pixewakb
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.

Re: Zyklisch ein Array durclaufen

Verfasst: Freitag 25. Dezember 2015, 12:57
von Sirius3
@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']

Re: Zyklisch ein Array durclaufen

Verfasst: Samstag 26. Dezember 2015, 09:29
von kodela
@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