Track
/
Python
Python
/
Esercizi
/
Le montagne russe colossali di Chaitana
Le montagne russe colossali di Chaitana

Le montagne russe colossali di Chaitana

Esercizio di apprendimento

Introduzione

Un list è una raccolta mutabile di elementi in sequenza. Come la maggior parte delle raccolte (vedi i tipi integrati tuple, dict e set), gli array possono contenere riferimenti a qualsiasi tipo di dati (o a più tipi), compresi gli altri array. Gli array possono essere copiati in tutto o in parte tramite la notazione di slicing oppure usando <list>.copy(). Come qualsiasi sequenza, gli elementi all'interno di lists sono referenziati tramite un numero 0-based index partendo da sinistra, o un numero -1-based index partendo da destra.

Gli array supportano sia le operazioni di sequenza comuni sia quelle mutabili, come min(<list>)/max(<list>), <list>.index(), <list>.append() e <list>.reverse(). Gli elementi all'interno di un list possono essere iterati usando il costrutto for item in <list>. for index, item in enumerate(<list>) può essere usato quando servono sia l'indice sia il valore dell'elemento.

Python fornisce anche molti utili metodi degli array per lavorare con gli array. Una selezione di questi list methods è trattata di seguito.

Nota che quando manipoli un list con un list-method, modifichi l'array che è stato passato. Se non vuoi mutare il list originale, dovrai almeno farne una shallow copy tramite slicing o <list>.copy().

Aggiungere elementi

Per aggiungere un elemento alla fine, o al «lato destro», di un array esistente, usa <list>.append(<item>):

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

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

Invece di accodare, <list>.insert() ti permette di aggiungere l'elemento a un indice specifico dell'array. Richiede 2 parametri:

  1. lo <index> in cui vuoi che venga inserito l'elemento.
  2. lo <item> da inserire.

Nota: se l'index fornito è 0, l'elemento verrà aggiunto all'inizio («lato sinistro») del list. Se l'index fornito è maggiore dell'index finale del list, l'elemento verrà aggiunto nell'ultima posizione, l'equivalente di usare <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]

<list>.extend(<item>) può essere usato per combinare un array esistente con gli elementi di un altro iterabile (per esempio un set, tuple, str o list). L'iterabile viene scompattato e gli elementi vengono aggiunti in ordine (in questo caso, usare <list>.append(<item>) aggiungerebbe l'intero iterabile come un singolo elemento.).

>>> 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]]

Rimuovere elementi

Per eliminare un elemento da un array usa <list>.remove(<item>), passando come argomento l'elemento da rimuovere. <list>.remove(<item>) solleva un ValueError se l'elemento non è presente nel list.

>>> 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

In alternativa, usare il metodo <list>.pop(<index>) rimuove e return un elemento, rendendolo disponibile per l'uso.

<list>.pop(<index>) accetta un parametro opzionale: l'index dell'elemento da rimuovere e restituire. Se l'argomento (opzionale) index non è specificato, verranno rimossi e restituiti l'ultimo elemento del list. Se l'index specificato è maggiore dell'index dell'ultimo elemento, viene sollevato un IndexError.

>>> 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

Tutti gli elementi possono essere rimossi da un list con list.clear(). Non accetta alcun parametro.

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

>>> numbers
[]

Invertire e riordinare

Il metodo <list>.reverse() inverte l'ordine degli elementi sul posto.

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

>>> numbers
[3, 2, 1]

Un array può essere riordinato sul posto con l'aiuto di <list>.sort(). L'ordinamento predefinito è crescente da sinistra. La documentazione di Python offre ulteriori suggerimenti e tecniche per l'ordinamento.

Note

Dal 2002 al 2022, Python usava internamente un algoritmo chiamato Timsort per ordinare gli array, ma da Python 3.11 in poi è passato a Powersort.

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

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

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

Se vuoi un ordine decrescente, passa l'argomento reverse=True:

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

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

Nei casi in cui non vuoi mutare l'array originale, puoi usare la funzione integrata sorted(<iterable>) per ottenere una copia ordinata.

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

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

Occorrenze di un elemento in un array

Il numero di occorrenze di un elemento in un array può essere calcolato con l'aiuto di list.count(<item>). Prende come argomento l'item da contare e restituisce il numero totale di volte in cui quell'elemento compare nel list.

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

>>> items.count(1)
3

Trovare l'indice degli elementi

<list>.index(<item>) restituisce il numero index della prima occorrenza di un elemento passato. Se non ci sono occorrenze, viene sollevato un ValueError. Se non serve la posizione esatta di un elemento, l'operatore integrato in è più efficiente per verificare se un array contiene un dato valore.

L'indicizzazione parte da zero a sinistra, quindi la posizione del «primo» elemento è 0. L'indicizzazione funziona anche da destra, iniziando da -1.

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

>>> items.index(4)
1

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

Si possono anche fornire gli indici start e end per restringere la ricerca a una sezione specifica del list:

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

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

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

Istruzioni

Chaitana possiede un parco divertimenti molto popolare. Ha una sola attrazione, proprio al centro di un terreno splendidamente curato: The Biggest Roller Coaster in the World(TM). Anche se c'è solo questa attrazione, persone da tutto il mondo viaggiano e stanno in fila per ore per avere l'occasione di salire sulle montagne russe di Chaitana.

Per questa attrazione ci sono due code, ognuna rappresentata da una list:

  1. Coda normale
  2. Coda express (nota anche come Fast-track): qui si paga un supplemento per l'accesso prioritario.

Ti è stato chiesto di scrivere del codice per gestire meglio gli ospiti del parco. Devi implementare le seguenti funzioni il prima possibile, prima che gli ospiti (e il tuo capo, Chaitana!) si innervosiscano. Leggi con attenzione. Alcuni compiti ti chiedono di modificare o aggiornare la coda esistente, altri di farne una copia.

1. Aggiungimi alla coda

Definisci la funzione add_me_to_the_queue() che prende 4 parametri <express_queue>, <normal_queue>, <ticket_type>, <person_name> e restituisce la coda appropriata aggiornata con il nome della persona.

  1. <ticket_type> è un int, dove 1 == express_queue e 0 == normal_queue.
  2. <person_name> è il nome (come str) della persona da aggiungere alla coda corrispondente.
>>> 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. Dove sono i miei amici?

Una persona è arrivata tardi al parco ma vuole mettersi nella coda dove aspettano i suoi amici. Però non ha idea di dove si trovino i suoi amici e non c'è campo per chiamarli.

Definisci la funzione find_my_friend() che prende 2 parametri queue e friend_name e restituisce la posizione nella coda del nome della persona.

  1. <queue> è la list delle persone in attesa nella coda.
  2. <friend_name> è il nome dell'amico di cui devi trovare l'indice (la posizione nella coda).

Ricorda: l'indicizzazione parte da 0 da sinistra e da -1 da destra.

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

3. Posso unirmi a loro?

Ora che i suoi amici sono stati trovati (nel compito 2 qui sopra), chi è arrivato tardi vorrebbe unirsi a loro nella loro posizione in coda. Definisci la funzione add_me_with_my_friends() che prende 3 parametri queue, index e person_name.

  1. <queue> è la list delle persone in attesa nella coda.
  2. <index> è la posizione in cui aggiungere la nuova persona.
  3. <person_name> è il nome della persona da aggiungere nella posizione indicata dall'indice.

Restituisci la coda aggiornata con il nome di chi è arrivato tardi.

>>> 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. Persona maleducata in coda

Hai appena sentito dalla coda che c'è una persona davvero maleducata che spinge, urla e crea problemi. Devi cacciare quel mascalzone per il suo cattivo comportamento!

Definisci la funzione remove_the_mean_person() che prende 2 parametri queue e person_name.

  1. <queue> è la list delle persone in attesa nella coda.
  2. <person_name> è il nome della persona da cacciare.

Restituisci la coda aggiornata senza il nome della persona maleducata.

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

5. Omonimi

Potresti non aver mai visto due persone non imparentate identiche nell'aspetto, ma hai sicuramente visto persone non imparentate con lo stesso identico nome (omonimi)! Oggi sembra che ce ne siano molte tra i presenti. Vuoi sapere quante volte un certo nome compare nella coda.

Definisci la funzione how_many_namefellows() che prende 2 parametri queue e person_name.

  1. <queue> è la list delle persone in attesa nella coda.
  2. <person_name> è il nome che pensi possa comparire più di una volta nella coda.

Restituisci il numero di occorrenze di person_name, come int.

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

6. Rimuovi l'ultima persona

Purtroppo oggi il parco è sovraffollato e devi rimuovere l'ultima persona della coda normale (le darai un buono per tornare in fast-track un altro giorno). Dovrai definire la funzione remove_the_last_person() che prende 1 parametro, queue, cioè la coda delle persone in attesa.

Devi aggiornare la list e anche restituire con return il nome della persona rimossa, così puoi scriverle un buono.

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

7. Ordina la coda

Per motivi amministrativi, devi ottenere tutti i nomi di una data coda in ordine alfabetico.

Definisci la funzione sorted_names() che prende 1 argomento, queue (la list delle persone in attesa nella coda), e restituisce una copia sorted della list.

>>> sorted_names(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
...
['Eltran', 'Natasha', 'Natasha', 'Rocket', 'Steve']
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Python Exercism

Vuoi iniziare Le montagne russe colossali di Chaitana?

Iscriviti a Exercism per imparare e padroneggiare Python con 17 concetti146 esercizi e il mentoring di persone reali, tutto gratis.