python et les types de bases **************************** liste ===== Les listes sont des objets qui possèdent quelques méthodes très pratiques pour les manipuler: * l.append(x) : ajoute l’occurence x en fin de liste. * l.extend(x) : ajoute chaque élement de la séquence x en fin de liste. * l.count(x) : renvoie le nombre d’occurences x de la liste. * l.index(x[, i[, j]]) : retourne le plus petit k tel que s[k] = x et i<=k<=j. retourne une erreur si l’élément n’est pas présent dans la liste. Si i et j sont omis, l’ensemble de la liste est considéré. * l.insert(i, x) : insère l’occurence x à la position i. * l.pop([i]) : retourne l’élément de la position i et le supprime de la liste. Si i est omis, le dernier élément de la liste est retourné et supprimé * l.remove(x) : supprime la première occurence de x de la liste. retourne une erreur si cette valeur n’est pas présente. * l.reverse(): renverse la liste sur place. * l.sort([cmp[, key[, reverse]]]) : trie les éléments de la liste sur place. Vous pouvez définir votre propre fonction de comparaison en définissant le paramètre cmp. Le booléan reverse permet de retourner ou non la liste triée dans l’ordre croissant ou décroissant. Si ces paramètres sont omis, la liste est triée dans l’ordre alphanumérique croissant. .. code-block:: bash >>> l =['David', 'Pythonista', '+1-514-555-1234'] >>> name, title, phone = l >>> name 'David' >>> title 'Pythonista' >>> phone '+1-514-555-1234' pour inverser une liste .. code-block:: python x = x[::-1] on peut à partir d'une liste créer un itérateur .. code-block:: python iterator = range(10).__iter__() while True: try: x = iterator.__next__() except StopIteration: break print(x) il est possible à partir d'un tableau (une liste de listes) de l'inversé .. code-block:: bash >>>a = [[11,12,13], [21,22,23], [31,32,33]] >>>b=zip(*a) >>>print(b) [[11,21,31], [12,22,32], [12,23,33]] il est aussi possible d'énumérer les élements du liste .. code-block:: bash >>>for i,c in enumerate(range(10)): print(i,c) (0, 0) (1, 1) (2, 2) (3, 3) (4, 4) (5, 5) (6, 6) (7, 7) (8, 8) (9, 9) .. code-block:: python my_container = ['Larry', 'Moe', 'Curly'] for index, element in enumerate(my_container): print ('{} {}'.format(index, element)) suppression d’une occurence --------------------------- .. code-block:: python l = [1,5,4,1,23,1,2,1] try: while True: l.remove(1) except: pass print l ## [5,4,23,2] vider une liste --------------- .. code-block:: python del(mylist[:]) ou .. code-block:: python while mylist: mylist.pop() filtrer une liste ----------------- .. code-block:: python obj = {'tutu':'filtrer','ae':'non filtrer','tyty':'filtrer'} a = [item for item in obj.keys() if item.startswith('t') ] trier et filtrer une liste d'objet ---------------------------------- un exemple simple: nous avons un objet port qui est défini par: - une ip - un port on gère une liste de ces objets et on souhaite: - trier la liste par ip puis port - filtrer que les ports déclarés "open" .. code-block:: python class Port: def __init__(self, ip, port=None): self.ip = ip self.port = port self.value = -2 def __lt__(self, other): if self.ip == other.ip: return self.port < other.port return self.ip < other.ip def __le__(self, other): if self.ip == other.ip: return self.port <= other.port return self.ip <= other.ip def __eq__(self, other): if self.ip == other.ip: return self.port == other.port return self.ip == other.ip def __ne__(self, other): if self.ip == other.ip: return self.port != other.port return self.ip != other.ip def __gt__(self, other): if self.ip == other.ip: return self.port > other.port return self.ip > other.ip def __ge__(self, other): if self.ip == other.ip: return self.port >= other.port return self.ip >= other.ip def onlyOpen(p): if p.value == 1: return True return False a =[] a.append(Port('127.0.0.1','8080')) a.append(Port('127.0.0.1','78')) a.append(Port('88.26.76.33','8080')) p = Port('192.168.1.1','8080') p.value = 1 #port ouvert a.append(p) for i in a: print(i.ip, i.port) a.sort() for i in a: print(i.ip, i.port) b = filter(onlyOpen, a) for i in b: print(i.ip, i.port) faire un if en une ligne ======================== on peut faire un if comme cela .. code-block:: python a = 2 if a > 1: b = False else: b = True ou .. code-block:: python a = 2 b = a >= 1 and True or False il est aussi possible de gérer facilement les valeurs null .. code-block:: python a = None if a: b = 'tutu' else: b = a peut être remplacé par .. code-block:: python a = None b = (a or 'tutu') obtenir la moyenne d'une liste ============================== Objectif: obtenir la moyenne des écarts entre les valeurs d'une liste On traite içi la problématique des laps time .. code-block:: python nums = [1, 10, 17, 22, 29, 37, 49, 55, 58] print([x-y for x,y in zip(nums[1:],nums)]) >>> [9, 7, 5, 7, 8, 12, 6, 3] delta=[x-y for x,y in zip(nums[1:],nums)] float(sum(delta))/len(delta) >>> 7.0 dictionnaire ============ * dic={}: initialise un dictionnaire * dic[cle]: Retourne la valeur associée à la clé cle * dic.get(cle, val): Retourne la valeur associée à la clé cle, ou val si la clé n’existe pas * dic[cle] = val: Assigne la valeur val à cle (si la clé n’existe pas, elle est créée) * del dic[cle]: Supprime la clé cle * dic.clear(): Vide le dictionnaire * dic1.update(dic2): Assigne à dic1 les éléments de dic2 * dic.keys() donne la liste des clés * dic.has_keys(k) indique si liste possède cette clé * dic.values() donne la liste des valeurs * dic.items() donne la liste des couples (clé, valeur) il est possible de créer un dictionnaire à partir d'une liste .. code-block:: python a = {i : a for i,a in enumerate(range(10)) } création d'un dictionnaire à partir de deux listes .. code-block:: python 1 >>a=['aa','bb','cc'] 2 >>b=[1,2,3] 3 >>dico = {k: v for k, v in zip(b,a)} 4 >>print dico {1: 'aa', 2: 'bb', 3: 'cc'} fonction ======== .. code-block:: python def somme(*args): return sum(args) def calcul(**keys): score = keys['value'] if 'somme' in keys: score += keys['somme'] if 'produit' in keys: score *= keys['produit'] return score print calcul(value = 5, somme = 2, produit = 7) print calcul(value = 4, produit = 9)