Une collection ordonnée que l'on peut modifier
Une liste garde des valeurs dans l'ordre entre crochets : [184.0, 185.5, 183.2]. Elle peut contenir n'importe quelles valeurs, et len(prices) indique combien. Chaque élément a une position appelée indice, comptée à partir de 0. Un indice négatif compte depuis la fin : -1 est le dernier élément. Demander une position inexistante lève une IndexError.
prices = [184.0, 185.5, 183.2, 186.1]
# Reading by position
print(prices[0]) # 184.0
print(prices[-1]) # 186.1
print(len(prices)) # 4
# A list is changeable: assign to a position
prices[1] = 185.0
print(prices) # [184.0, 185.0, 183.2, 186.1]Le découpage : une partie d'une liste
prices[start:stop] donne une nouvelle liste de start jusqu'à stop exclu. Omettez une borne et la tranche va jusqu'à ce bout : prices[:3] donne les trois premiers, prices[-3:] les trois derniers. Une tranche ne lève jamais d'erreur si elle dépasse, elle s'arrête simplement à la fin. Un piège : -0 vaut 0, donc prices[-0:] est la liste entière, pas une liste vide.
prices = [184.0, 185.0, 183.2, 186.1, 187.4]
# Slices are new lists
print(prices[1:3]) # [185.0, 183.2]
print(prices[:2]) # [184.0, 185.0]
print(prices[-2:]) # [186.1, 187.4]
# Going past the end is fine, but -0 is not "none"
print(prices[3:99]) # [186.1, 187.4]
print(prices[-0:]) # the whole listAjouter et retirer
append(x) ajoute un élément à la fin, extend(items) en ajoute plusieurs, et insert(i, x) en place un à la position i. pop() retire et renvoie le dernier élément (pop(i) celui en i), et remove(x) supprime le premier élément égal à x. Ces méthodes modifient la liste sur place et renvoient None : prices = prices.append(1) laisse donc prices à None. Additionner avec + construit au contraire une nouvelle liste.
# Changing a list in place
fills = [100, 250]
fills.append(75)
fills.extend([40, 60])
print(fills) # [100, 250, 75, 40, 60]
last = fills.pop()
fills.remove(250)
print(last, fills) # 60 [100, 75, 40]
# + builds a new list and leaves the old ones alone
both = fills + [10]
print(both, fills) # [100, 75, 40, 10] [100, 75, 40]Trier
Il y a deux façons de trier. prices.sort() réordonne la liste sur place et renvoie None. sorted(prices) laisse l'original intact et renvoie une nouvelle liste triée ; elle accepte aussi n'importe quel itérable. Toutes deux acceptent reverse=True pour le plus grand d'abord et key=... pour trier selon autre chose, par exemple key=len. Préférez sorted quand d'autres parties du code peuvent encore utiliser l'ordre d'origine.
# sorted() returns a new list, sort() changes the old one
prices = [185.0, 183.2, 187.4, 184.0]
ranked = sorted(prices, reverse=True)
print(ranked) # [187.4, 185.0, 184.0, 183.2]
print(prices) # [185.0, 183.2, 187.4, 184.0] (unchanged)
prices.sort()
print(prices) # [183.2, 184.0, 185.0, 187.4]Deux noms, une seule liste
backup = prices ne copie pas la liste : les deux noms désignent le même objet, donc modifier l'un modifie l'autre. Faites une vraie copie (superficielle) avec prices.copy(), list(prices) ou la tranche prices[:]. Il en va de même pour les fonctions : une fonction qui appelle .append, .sort ou .pop sur son argument modifie aussi la liste de l'appelant, ce qui est rarement ce qu'il attend.
# A second name is not a copy
prices = [184.0, 185.0]
alias = prices
alias.append(186.0)
print(prices) # [184.0, 185.0, 186.0]
# A real copy is independent
backup = list(prices)
backup.append(187.0)
print(prices) # [184.0, 185.0, 186.0]
print(backup) # [184.0, 185.0, 186.0, 187.0]sorted(...), les tranches et les compréhensions, qui construisent toutes de nouvelles listes. Les labs vérifient que la liste reçue est inchangée ensuite.items[i],items[-1]: un élément ;items[a:b]: une nouvelle liste.append,extend,insert,pop,removemodifient la liste et ne renvoient rien d'utile.sorted(items)construit une nouvelle liste triée ;items.sort()réordonne sur place.
À suivre : les tuples et le déballage, le cousin de taille fixe de la liste, et une façon propre de séparer des valeurs.
Lab : ce qui est noté
- Choisir les prix les plus élevés avec
top_n25 pts - Prendre les valeurs les plus récentes avec
last_n25 pts - Moyenner chaque fenêtre de prix avec
moving_average25 pts - Déplacer des valeurs d'un bout à l'autre avec
rotate25 pts