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.
>>> l =['David', 'Pythonista', '+1-514-555-1234']
>>> name, title, phone = l
>>> name
'David'
>>> title
'Pythonista'
>>> phone
'+1-514-555-1234'

pour inverser une liste

x = x[::-1]

on peut à partir d’une liste créer un itérateur

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é

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

>>>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)
my_container = ['Larry', 'Moe', 'Curly']
for index, element in enumerate(my_container):
    print ('{} {}'.format(index, element))

suppression d’une occurence

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

del(mylist[:])

ou

while mylist: mylist.pop()

filtrer une liste

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

a = 2
if a > 1:
    b = False
else:
    b = True

ou

a = 2
b = a >= 1 and True or False

il est aussi possible de gérer facilement les valeurs null

a = None
if a:
    b = 'tutu'
else:
    b = a

peut être remplacé par

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

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

a = {i : a for i,a in enumerate(range(10)) }

création d’un dictionnaire à partir de deux listes

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

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)