Py: Special tactics
Py: Special tactics

Pyhton Ninja

Directory

format et join

mots = ['poule', 'vache', 'poney']
print(', '.join('{}'.format(m) for m in mots))

Compter des occurences

>>> import random
>>> from collections import Counter
>>>
>>> l = [random.randint(1,10) for i in range(1000)]
>>>> print(Counter(l))
Counter({5: 115, 8: 111, 7: 104, 2: 102, 1: 101, 3: 100, 6: 97, 4: 94, 10: 90, 9: 86})
>>> s = "j'aime la viande rouge bien cuite"
>>> print(Counter(s))
Counter({'e': 5, ' ': 5, 'i': 4, 'a': 3, 'u': 2, 'n': 2, 'j': 1, 'r': 1, 'b': 1, 'd': 1,
'm': 1, 't': 1, "'": 1, 'l': 1, 'v': 1, 'c': 1, 'g': 1, 'o': 1})

Sous forme de tuples

Permet de pouvoir utiliser un indexe pour sortir directement une valeur:

s = "j'aime la viande rouge bien cuite"
counted = Counter(s).most_common()
print("Le char '{}' apparait le plus dans la string:\n{}\n\
    Nombre d'occurences: {}\n Suivi par le char '{}' \
    qui apparait {} fois.".format(
        counted[0][0], s, counted[0][1], counted[1][0], counted[1][1]))

return:

Le char e apparait le plus dans la string:
j'aime la viande rouge bien cuite
    Nombre d'occurences:5
 Suivi par le char ' '     qui apparait 5 fois.

List reverse

>>> x = range(10)
>>> x[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

Pareil avec des strings.

Reversed

Cette fonction renvoie un itérateur qui itère à l’envers sur une séquence:

>>> for i in reversed([1,2,3]):
...     print(i)
...
3
2
1

Multi list iteration

>>> names = ['a', 'b', 'c']
>>> values = [1, 2, 3]
>>> for name, values, in zip(names, values):
...     print(name, values)
...
a 1
b 2
c 3

Méthode sort et sorted built-in

La méthode sort trie une liste. Le tri est stable (voir algo: tri).

>>> a = [2 ,10, 4, 3, 7]
>>> a.sort()
>>> a
[2, 3, 4, 7, 10]

Il est possible de spécifier une fonction comme argument de tri. Ici nous trions en fonction du second élément des sous-listes:

>>> a = [[2, 3], [4, 6], [6, 1]]
>>> a.sort(key=lambda x: x[1])
>>> a
[[6, 1], [2, 3], [4, 6]]

Noter qu’un print de a.sort() retournera none.

Et là, en fonction de la taille des éléments:

>>> l = ['python', 'perl', 'java', 'c', 'haskell', 'ruby']
>>> l.sort(key=lambda x: len(x))
>>> l
['c', 'perl', 'java', 'ruby', 'python', 'haskell']

La fonction sorted prend une séquence et retourne une liste des éléments triée (ne modifie pas la source).

>>> a = [2 ,10, 4, 3, 7] # list
>>> sorted(a)
[2, 3, 4, 7, 10]
>>> a
[2 ,10, 4, 3, 7]
>>>
>>> b = (2 ,10, 4, 3, 7) # tuple
>>> sorted(b)
[2, 3, 4, 7, 10]
>>> tuple(sorted(b))
(2, 3, 4, 7, 10)
>>> b
[2, 3, 4, 7, 10]

Strip

Cette méthode retourne une copie de la string passée en argument et avec les éventuels espace avant et après supprimés. On peut égallement lui passer une string en argument ce qui fait qu’à la place de retirer les éventuels espaces, la méthode retirera les éventuels cha de la string passée en argument:

>>> print(':abcd.efg!'.strip('.?!;:'))
abcd.efg

files

text.txt:

Integer tortor leo, faucibus id turpis non, gravida egestas
tortor. Curabitur blandit eget ipsum in malesuada. Aenean
elit elit, aliquam convallis tellus sit amet, elementum
semper nisl. 
def linecount(file):
    return len(open(file).readlines())

def wordcount(file):
    return len(open(file).read().split())

def charcount(file):
    return len(open(file).read())


F = 'text.txt'

print(charcount(F))
print(wordcount(F))
print(linecount(F))

output:

187
27
4

La méthode read() retourne une string avec le nombre char spécifié en argument (tout le fichier si aucun argument n’est spécifié).

La méthode readlines() retourne une liste de string des lignes du fichier.

la méthode readline() retourne les lignes du fichier dans une string une à la fois. Si il n’y a plus rien à lire, la méthode retourne des string vides.

>>> f = open('text.txt', 'w')
>>> f.writelines(['a\n', 'b\n', 'c\n'])
>>> f.close()
>>> print(open('text.txt').read())
a
b
c

La méthode writelines est pratique quand les données se trouvent dans une liste composée de strings.

Exemple:

text.txt

Integer tortor leo, faucibus id turpis non, gravida egestas
tortor. Curabitur blandit eget ipsum in malesuada. Aenean
elit elit, aliquam convallis tellus sit amet, elementum
semper nisl. 
def reverse_text(file):
    for i in reversed(file):
        print(i)

F = 'text.txt'

f = open(F)
l = []
for c, i in enumerate(f):
    l.append('{}) {}'.format(c+1, i))

f.close()

f = open(F, 'w')
f.writelines(l)

f.close()

reverse_text(F)

output:

4) semper nisl.
3) elit elit, aliquam convallis tellus sit amet, elementum
2) tortor. Curabitur blandit eget ipsum in malesuada. Aenean
1) Integer tortor leo, faucibus id turpis non, gravida egestas

Dans cet exemple, la fonction reversed() renvoie un itérateur qui itère à l’envers sur la liste.

List comprehension

Triplets de Pythagore:

>>> print([(x, y, z) for x in range(1, n) for y in range(x, n) for z in range(y, n) if x*x + y*y == z*z])
[(3, 4, 5), (5, 12, 13), (6, 8, 10), (8, 15, 17), (9, 12, 15), (12, 16, 20)]