Tracks
/
Python
Python
/
Übungen
/
Chaitanas kolossale Achterbahn
Chaitanas kolossale Achterbahn

Chaitanas kolossale Achterbahn

Lernübung

Einführung

Eine list ist eine veränderbare Sammlung von Elementen in einer Sequenz. Wie die meisten Sammlungen (siehe die eingebauten tuple, dict und set) können Listen Verweise auf jeden (oder mehrere) Datentyp(en) enthalten, auch auf andere Listen. Listen lassen sich vollständig oder teilweise über die Slice-Notation oder mit <list>.copy() kopieren. Wie bei jeder Sequenz werden Elemente in lists über eine 0-based index-Nummer von links oder eine -1-based index-Nummer von rechts referenziert.

Listen unterstützen sowohl gemeinsame als auch veränderbare Sequenzoperationen wie min(<list>)/max(<list>), <list>.index(), <list>.append() und <list>.reverse(). Über die Elemente in einer list kannst du mit dem Konstrukt for item in <list> iterieren. for index, item in enumerate(<list>) kannst du verwenden, wenn du sowohl den Index als auch den Wert eines Elements brauchst.

Python bietet außerdem viele nützliche Listen-Methoden für die Arbeit mit Listen. Eine Auswahl dieser list methods wird unten behandelt.

Beachte: Wenn du eine list mit einer list-method bearbeitest, veränderst du die Liste, also das Objekt, das übergeben wurde. Wenn du die ursprüngliche list nicht verändern willst, musst du zumindest eine shallow copy davon über einen Slice oder <list>.copy() anlegen.

Elemente hinzufügen

Um ein Element am Ende oder auf der „rechten Seite“ einer bestehenden Liste hinzuzufügen, verwende <list>.append(<item>):

>>> numbers = [1, 2, 3]
>>> numbers.append(9)

>>> numbers
[1, 2, 3, 9]

Statt anzuhängen, gibt dir <list>.insert() die Möglichkeit, das Element an einem bestimmten Index in die Liste einzufügen. Sie erwartet 2 Parameter:

  1. den <index>, an dem das Element eingefügt werden soll.
  2. das <item>, das eingefügt werden soll.

Hinweis: Wenn der angegebene index 0 ist, wird das Element am Anfang (der „linken Seite“) der list eingefügt. Wenn der angegebene index größer ist als der letzte index der list, wird das Element an der letzten Position eingefügt – das entspricht <list>.append(<item>).

>>> numbers = [1, 2, 3]
>>> numbers.insert(0, -2)

>>> numbers
[-2, 1, 2, 3]

>>> numbers.insert(1, 0)

>>> numbers
[-2, 0, 1, 2, 3]

Mit <list>.extend(<item>) kannst du eine bestehende Liste mit den Elementen aus einem anderen Iterable kombinieren (zum Beispiel einem set, tuple, str oder list). Das Iterable wird entpackt und die Elemente werden der Reihenfolge nach angehängt (Würdest du in diesem Fall <list>.append(<item>) verwenden, würde das gesamte Iterable als ein einzelnes Element hinzugefügt.).

>>> numbers = [1, 2, 3]
>>> other_numbers = [5, 6, 7]

>>> numbers.extend(other_numbers)

>>> numbers
[1, 2, 3, 5, 6, 7]

>>> numbers.extend([8, 9])

>>> numbers
[1, 2, 3, 5, 6, 7, 8, 9]

>>> numbers.append([8,9])

>>> numbers
[1, 2, 3, 5, 6, 7, 8, 9, [8, 9]]

Elemente entfernen

Um ein Element aus einer Liste zu löschen, verwende <list>.remove(<item>) und übergib das zu entfernende Element als Argument. <list>.remove(<item>) löst einen ValueError aus, wenn das Element nicht in der list vorhanden ist.

>>> numbers = [1, 2, 3]
>>> numbers.remove(2)

>>> numbers
[1, 3]

# Trying to remove a value that is not in the list throws a ValueError
>>> numbers.remove(0)
ValueError: list.remove(x): x not in list

Alternativ entfernt die Methode <list>.pop(<index>) ein Element und gibt es per return zur weiteren Verwendung zurück.

<list>.pop(<index>) nimmt einen optionalen Parameter entgegen: den index des Elements, das entfernt und zurückgegeben werden soll. Wenn das (optionale) index-Argument nicht angegeben wird, wird das letzte Element der list entfernt und zurückgegeben. Wenn der angegebene index höher ist als der index des letzten Elements, wird ein IndexError ausgelöst.

>>> numbers = [1, 2, 3]

>>> numbers.pop(0)
1

>>> numbers
[2, 3]

>>> numbers.pop()
3

>>> numbers
[2]

>>> numbers.pop(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: pop index out of range

Mit list.clear() kannst du alle Elemente aus einer list entfernen. Die Methode nimmt keine Parameter entgegen.

>>> numbers = [1, 2, 3]
>>> numbers.clear()

>>> numbers
[]

Umkehren und Neuordnen

Die Methode <list>.reverse() kehrt die Reihenfolge der Elemente in-place um.

>>> numbers = [1, 2, 3]
>>> numbers.reverse()

>>> numbers
[3, 2, 1]

Eine Liste kann mit Hilfe von <list>.sort() in place neu geordnet werden. Die Standard-Sortierreihenfolge ist aufsteigend von links. Die Python-Dokumentation bietet weitere Tipps und Techniken zum Sortieren.

Note

Von 2002 bis 2022 verwendete Python intern einen Algorithmus namens Timsort, um Listen zu sortieren, wechselte aber ab Python 3.11 zu Powersort.

>>> names = ["Tony", "Natasha", "Thor", "Bruce"]

# The default sort order is *ascending*.
>>> names.sort()

>>> names
["Bruce", "Natasha", "Thor", "Tony"]

Wenn du eine absteigende Reihenfolge möchtest, übergib das Argument reverse=True:

>>> names = ["Tony", "Natasha", "Thor", "Bruce"]
>>> names.sort(reverse=True)

>>> names
["Tony", "Thor", "Natasha", "Bruce"]

Wenn du die ursprüngliche Liste nicht verändern möchtest, kannst du die eingebaute Funktion sorted(<iterable>) verwenden, um eine sortierte Kopie zurückzugeben.

>>> names = ["Tony", "Natasha", "Thor", "Bruce"]

>>> sorted(names)
['Bruce', 'Natasha', 'Thor', 'Tony']

Vorkommen eines Elements in einer Liste

Die Anzahl der Vorkommen eines Elements in einer Liste kannst du mit list.count(<item>) ermitteln. Sie nimmt das zu zählende item als Argument und gibt zurück, wie oft dieses Element in der list vorkommt.

>>> items = [1, 4, 7, 8, 2, 9, 2, 1, 1, 0, 4, 3]

>>> items.count(1)
3

Den Index von Elementen finden

<list>.index(<item>) gibt die index-Nummer des ersten Vorkommens eines übergebenen Elements zurück. Wenn es kein Vorkommen gibt, wird ein ValueError ausgelöst. Wenn die genaue Position eines Elements nicht benötigt wird, ist der eingebaute in-Operator effizienter, um zu prüfen, ob eine Liste einen bestimmten Wert enthält.

Die Indizierung beginnt von links bei null, die Position des „ersten“ Elements ist also 0. Die Indizierung funktioniert auch von rechts, beginnend bei -1.

>>> items = [7, 4, 1, 0, 2, 5]

>>> items.index(4)
1

>>> items.index(10)
ValueError: 10 is not in list

Du kannst auch die Indizes start und end angeben, um die Suche auf einen bestimmten Abschnitt der list einzugrenzen:

>>> names = ["Tina", "Leo", "Thomas", "Tina", "Emily", "Justin"]

>>> names.index("Tina")
0

>>> names.index("Tina", 2, 5)
3

Anleitung

Chaitana besitzt einen sehr beliebten Freizeitpark. Sie hat nur eine einzige Attraktion, genau im Zentrum einer wunderschön angelegten Parklandschaft: Die größte Achterbahn der Welt(TM). Obwohl es nur diese eine Attraktion gibt, reisen Menschen aus aller Welt an und stehen stundenlang an, um die Chance zu bekommen, Chaitanas Hypercoaster zu fahren.

Für diese Bahn gibt es zwei Warteschlangen, die jeweils als list dargestellt werden:

  1. Normale Warteschlange
  2. Express-Warteschlange (auch bekannt als Fast-Track) – dort zahlen die Leute extra für bevorzugten Zugang.

Du sollst etwas Code schreiben, um die Gäste im Park besser zu verwalten. Du musst die folgenden Funktionen so schnell wie möglich implementieren, bevor die Gäste (und deine Chefin Chaitana!) schlechte Laune bekommen. Lies aufmerksam. Bei manchen Aufgaben sollst du die vorhandene Warteschlange ändern oder aktualisieren, bei anderen eine Kopie davon erstellen.

1. Füge mich zur Warteschlange hinzu

Definiere die Funktion add_me_to_the_queue(), die 4 Parameter <express_queue>, <normal_queue>, <ticket_type>, <person_name> entgegennimmt und die passende Warteschlange zurückgibt, die um den Namen der Person ergänzt wurde.

  1. <ticket_type> ist ein int mit 1 == express_queue und 0 == normal_queue.
  2. <person_name> ist der Name (als str) der Person, die zur jeweiligen Warteschlange hinzugefügt werden soll.
>>> add_me_to_the_queue(express_queue=["Tony", "Bruce"], normal_queue=["RobotGuy", "WW"], ticket_type=1, person_name="RichieRich")
...
["Tony", "Bruce", "RichieRich"]

>>> add_me_to_the_queue(express_queue=["Tony", "Bruce"], normal_queue=["RobotGuy", "WW"], ticket_type=0, person_name="HawkEye")
....
["RobotGuy", "WW", "HawkEye"]

2. Wo sind meine Freunde?

Eine Person ist zu spät im Park angekommen, möchte sich aber der Warteschlange anschließen, in der ihre Freunde warten. Sie hat aber keine Ahnung, wo ihre Freunde stehen, und es gibt keinen Handyempfang, um sie anzurufen.

Definiere die Funktion find_my_friend(), die 2 Parameter queue und friend_name entgegennimmt und die Position des Namens dieser Person in der Warteschlange zurückgibt.

  1. <queue> ist die list der Personen, die in der Warteschlange stehen.
  2. <friend_name> ist der Name des Freundes, dessen Index (Platz in der Warteschlange) du finden musst.

Zur Erinnerung: Die Indizierung beginnt bei 0 von links und bei -1 von rechts.

>>> find_my_friend(queue=["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], friend_name="Steve")
...
1

3. Darf ich mich bitte dazustellen?

Nachdem ihre Freunde gefunden wurden (in Aufgabe 2 oben), möchte die zu spät gekommene Person an deren Platz in der Warteschlange dazustoßen. Definiere die Funktion add_me_with_my_friends(), die 3 Parameter queue, index und person_name entgegennimmt.

  1. <queue> ist die list der Personen, die in der Warteschlange stehen.
  2. <index> ist die Position, an der die neue Person eingefügt werden soll.
  3. <person_name> ist der Name der Person, die an der Indexposition eingefügt werden soll.

Gib die Warteschlange zurück, aktualisiert um den Namen der zu spät gekommenen Person.

>>> add_me_with_my_friends(queue=["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], index=1, person_name="Bucky")
...
["Natasha", "Bucky", "Steve", "T'challa", "Wanda", "Rocket"]

4. Gemeine Person in der Warteschlange

Du hast gerade aus der Warteschlange gehört, dass dort eine richtig gemeine Person drängelt, herumschreit und Ärger macht. Du musst diesen Übeltäter wegen schlechten Benehmens rauswerfen!

Definiere die Funktion remove_the_mean_person(), die 2 Parameter queue und person_name entgegennimmt.

  1. <queue> ist die list der Personen, die in der Warteschlange stehen.
  2. <person_name> ist der Name der Person, die rausgeworfen werden muss.

Gib die Warteschlange ohne den Namen der gemeinen Person zurück.

>>> remove_the_mean_person(queue=["Natasha", "Steve", "Eltran", "Wanda", "Rocket"], person_name="Eltran")
...
["Natasha", "Steve", "Wanda", "Rocket"]

5. Namensvettern

Vielleicht hast du noch nie zwei nicht verwandte Personen gesehen, die genau gleich aussehen, aber du hast garantiert schon nicht verwandte Personen mit exakt demselben Namen gesehen (Namensvetter)! Heute scheinen jede Menge davon anwesend zu sein. Du möchtest wissen, wie oft ein bestimmter Name in der Warteschlange vorkommt.

Definiere die Funktion how_many_namefellows(), die 2 Parameter queue und person_name entgegennimmt.

  1. <queue> ist die list der Personen, die in der Warteschlange stehen.
  2. <person_name> ist der Name, von dem du vermutest, dass er mehr als einmal in der Warteschlange vorkommt.

Gib die Anzahl der Vorkommen von person_name als int zurück.

>>> how_many_namefellows(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"], person_name="Natasha")
...
2

6. Entferne die letzte Person

Leider ist der Park heute überfüllt, und du musst die letzte Person in der normalen Warteschlange entfernen (du gibst ihr einen Gutschein, damit sie an einem anderen Tag über den Fast-Track zurückkommen kann). Du musst die Funktion remove_the_last_person() definieren, die 1 Parameter queue entgegennimmt, also die Liste der Personen, die in der Warteschlange stehen.

Du solltest die list aktualisieren und außerdem den Namen der entfernten Person mit return zurückgeben, damit du ihr einen Gutschein schreiben kannst.

>>> remove_the_last_person(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
...
'Rocket'

7. Sortiere die Warteschlangenliste

Für administrative Zwecke musst du alle Namen in einer bestimmten Warteschlange in alphabetische Reihenfolge bringen.

Definiere die Funktion sorted_names(), die 1 Argument queue entgegennimmt (die list der Personen, die in der Warteschlange stehen), und eine sorted-Kopie der list zurückgibt.

>>> sorted_names(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
...
['Eltran', 'Natasha', 'Natasha', 'Rocket', 'Steve']
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Python Exercism

Bereit, mit Chaitanas kolossale Achterbahn zu starten?

Melde dich bei Exercism an, um Python mit 17 Konzepte146 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.