This repository has been archived on 2019-08-09. You can view files and clone it, but cannot push or open issues or pull requests.
s1-tp/S2/TP2/tp2.py

499 lines
12 KiB
Python
Raw Normal View History

# PREUD'HOMME Geoffrey
2015-01-26 23:06:46 +01:00
# BEAUSSART Jean-loup
# Donné le 27/01/2015
2015-01-26 23:06:46 +01:00
# TP2 Anagrammes - Dictionnaires
# http://www.fil.univ-lille1.fr/~L1S2API/CoursTP/tp2_dictionnaires.html
def partie(nom):
print('\n\n\n###', nom, '###')
def section(nom):
print('\n\n===', nom, '===')
def question(numero):
print('\n***', 'Question', numero, '***')
2015-02-03 10:47:19 +01:00
partie('Quelques méthodes sur les listes et les chaînes') # Geoffrey
2015-01-26 23:06:46 +01:00
2015-01-27 11:17:24 +01:00
# TODO fonction → méthode
2015-01-27 10:51:45 +01:00
section('Méthode split')
2015-01-26 23:06:46 +01:00
question(1)
print(">>> s = 'la méthode split est parfois bien utile'")
s = 'la méthode split est parfois bien utile'
print(">>> s.split (' ')")
print(s.split (' '))
print(">>> s.split ('e')")
print(s.split ('e'))
print(">>> s.split ('é')")
print(s.split ('é'))
print(">>> s.split ()")
print(s.split ())
print(">>> s.split ('')")
print('ValueError: empty separator')
print(">>> s.split ('split')")
print(s.split ('split'))
2015-01-27 10:50:06 +01:00
2015-01-26 23:06:46 +01:00
question(2)
2015-01-27 10:50:06 +01:00
# TODO Reformuler
2015-01-26 23:06:46 +01:00
2015-02-03 10:47:19 +01:00
print(
'La méthode `split` appliquée à une chaîne de caractères renvoie une liste de chaînes de caractères correspondant à la chaîne de caractère originale découpée aux endroits où se trouvent la chaîne de caractère passée en paramètre (ou si absente, la chaîne de caractères contenant le caractère espacement seul), exemptée de cette dernière.')
2015-01-26 23:06:46 +01:00
question(3)
2015-01-27 10:50:06 +01:00
# TODO utf-8
# TODO en print
2015-01-26 23:06:46 +01:00
print(">>> s = 'la méthode split est parfois bien utile'")
s = 'la méthode split est parfois bien utile'
print(">>> s.split(' ')")
print(s.split(' '))
print('>>> s')
print('\''+s+'\'')
2015-01-26 23:06:46 +01:00
2015-02-03 10:47:19 +01:00
print(
'De par cet exemple, on remarque que s reste la même chaîne de caractère, `split` ne modifie donc pas la chaîne de caractères à laquelle elle s\'applique (ce qui est logique vu le caractère non-mutable des chaînes de caractères')
2015-01-26 23:06:46 +01:00
section('Méthode join')
question(1)
print(">>> s = 'la méthode split est parfois bien utile'")
s = 'la méthode split est parfois bien utile'
print('>>> l = s.split()')
l = s.split()
print('>>> "".join (l)')
print("".join (l))
print('>>> " ".join (l)')
print(" ".join (l))
print('>>> ";".join (l)')
print(";".join (l))
print('>>> " tralala ".join (l)')
print(" tralala ".join (l))
print('>>> "\n".join (l)')
print("\n".join (l))
print('>>> "".join (s)')
print("".join (s))
print('>>> "!".join (s)')
print("!".join (s))
print('>>> "".join ()')
print('TypeError: join() takes exactly one argument (0 given)')
print('>>> "".join ([])')
print("".join ([]))
print('>>> "".join ([1,2])')
print('TypeError: sequence item 0: expected str instance, int found')
2015-01-27 11:03:08 +01:00
2015-01-26 23:06:46 +01:00
question(2)
2015-02-03 10:47:19 +01:00
print(
'La méthode join concatène les chaînes de caractères contenues dans la liste passée en paramètre, en insérant entre deux la chaîne de caractère sur laquelle elle est appliquée.')
2015-01-27 11:03:08 +01:00
2015-01-26 23:06:46 +01:00
question(3)
print('>>> chaine = \'!\'')
chaine = '!'
print('>>> chaine.join(l)')
print(chaine.join(l))
print('>>> chaine')
print('\''+chaine+'\'')
2015-01-27 11:03:08 +01:00
2015-02-03 10:47:19 +01:00
print(
'De par cet exemple, on remarque que chaine reste la même chaîne de caractères, `join` ne modifie donc pas la chaîne de caractères à laquelle elle s\'applique (ce qui est logique vu le caractère non-mutable des chaînes de caractères')
2015-01-27 11:03:08 +01:00
2015-01-26 23:06:46 +01:00
question(4)
2015-02-03 10:47:19 +01:00
2015-01-27 11:03:08 +01:00
def join(chaine, sequence):
2015-02-03 10:47:19 +01:00
# TODO Docstring
res = ''
l = len(sequence)
for i in range(l):
res += sequence[i]
if i < l - 1:
res += chaine
return res
2015-01-27 11:03:08 +01:00
print(">>> join('.', ['raymond', 'calbuth', 'ronchin', 'fr'])")
print(join('.', ['raymond', 'calbuth', 'ronchin', 'fr']))
2015-01-26 23:06:46 +01:00
2015-01-27 11:17:24 +01:00
section('Méthode sort')
2015-01-26 23:06:46 +01:00
question(1)
print('>>> l = list (\'timoleon\')')
l = list ('timoleon')
print('>>> l.sort()')
l.sort()
print('>>> l')
print(l)
2015-01-27 11:02:24 +01:00
2015-01-27 11:17:24 +01:00
print('La méthode sort semble trier les lettres par ordre alphabétique')
2015-01-27 11:02:24 +01:00
print('>>> s = "Je n\'ai jamais joué de flûte."')
s = "Je n'ai jamais joué de flûte."
print('>>> l = list (s)')
l = list (s)
print('>>> l.sort()')
l.sort()
print('>>> l')
print(l)
2015-01-27 11:02:24 +01:00
2015-02-03 10:47:19 +01:00
print(
'La méthode sort trie aussi les caractères spéciaux : ponctuation au début, accents à la fin')
2015-01-27 11:02:24 +01:00
2015-02-03 10:47:19 +01:00
print(
'Il semblerait que la fonction sort trie les caractères de s selon l\'ordre croissant de leur numéro de code ASCII (ou tout encodage utilisé)')
2015-01-27 11:02:24 +01:00
2015-01-26 23:06:46 +01:00
question(2)
print('>>> l = [\'a\', 1]')
l = ['a', 1]
print('>>> l.sort()')
print('TypeError: unorderable types: int() < str()')
2015-01-27 11:02:24 +01:00
print('On obtient une erreur comme quoi les types str et int ne sont pas ordonnable. En effet, il n\'est pas logique d\'ordonner des caractères avec des chiffres.')
print('Notons qu\'il aurait très bien pu être possible que cette fonction utilise le code des caractères, puisque celui-ci est de type int, comme c\'était le cas avec Python 2.')
2015-01-27 11:02:24 +01:00
2015-01-26 23:06:46 +01:00
section('Une fonction sort pour les chaînes')
question(1)
2015-02-03 10:47:19 +01:00
def sort(chaine):
# TODO Docstring
# TODO On peut pas faire plus court ?
l = list(chaine)
l.sort()
return ''.join(l)
print('>>> sort(\'timoleon\')')
print(sort('timoleon'))
2015-01-26 23:06:46 +01:00
2015-01-27 11:35:54 +01:00
2015-02-03 10:47:19 +01:00
partie('Anagrammes') # Jean-loup
2015-01-26 23:06:46 +01:00
question(1)
2015-02-03 10:47:19 +01:00
2015-02-03 10:43:38 +01:00
def sont_anagrammes1(chaine1, chaine2):
2015-01-27 11:02:24 +01:00
""" Prédicat, renvoie True si chaine1 et chaine2 sont des anagrammes, False sinon
str, str -> bool
CU: chaine1 et chaine2 sont des str
"""
2015-02-03 10:47:19 +01:00
assert(type(chaine1) == str and type(chaine2) == str)
2015-01-27 11:02:24 +01:00
2015-02-03 10:47:19 +01:00
# Si la longueur est différente ca ne peut pas être des anagrammes
if len(chaine1) != len(chaine2):
2015-01-27 11:02:24 +01:00
return False
c1 = sort(chaine1)
c2 = sort(chaine2)
2015-01-27 11:02:24 +01:00
return c1 == c2
2015-01-27 11:02:24 +01:00
2015-01-26 23:06:46 +01:00
question(2)
2015-02-03 10:47:19 +01:00
2015-01-27 11:02:24 +01:00
def sont_anagrammes2(chaine1, chaine2):
""" Prédicat, renvoie True si chaine1 et chaine2 sont des anagrammes, False sinon
str, str -> bool
CU: chaine1 et chaine2 sont des str
"""
2015-02-03 10:47:19 +01:00
assert(type(chaine1) == str and type(chaine2) == str)
2015-01-27 11:02:24 +01:00
2015-02-03 10:47:19 +01:00
# Si la longueur est différente ca ne peut pas être des anagrammes
if len(chaine1) != len(chaine2):
2015-01-27 11:02:24 +01:00
return False
2015-02-03 10:47:19 +01:00
occu1 = dict((i, chaine1.count(i)) for i in chaine1)
occu2 = dict((i, chaine2.count(i)) for i in chaine2)
2015-01-27 11:02:24 +01:00
return occu1 == occu2
2015-01-26 23:06:46 +01:00
question(3)
2015-02-03 10:47:19 +01:00
2015-02-03 10:43:38 +01:00
def sont_anagrammes3(chaine1, chaine2):
2015-01-27 11:02:24 +01:00
""" Prédicat, renvoie True si chaine1 et chaine2 sont des anagrammes, False sinon
str, str -> bool
CU: chaine1 et chaine2 sont des str
"""
2015-02-03 10:47:19 +01:00
assert(type(chaine1) == str and type(chaine2) == str)
2015-01-27 11:02:24 +01:00
2015-02-03 10:47:19 +01:00
# Si la longueur est différente ca ne peut pas être des anagrammes
if len(chaine1) != len(chaine2):
2015-01-27 11:02:24 +01:00
return False
2015-02-03 10:43:38 +01:00
for i in chaine1:
2015-01-27 11:02:24 +01:00
if chaine1.count(i) != chaine2.count(i):
return False
return True
2015-01-26 23:06:46 +01:00
section('Casse et accentuation')
question(1)
EQUIV_NON_ACCENTUE = {'é': 'e', 'è': 'e', 'à ': 'a', 'ç': 'c', 'î':'i', 'ï': 'i', 'ô': 'o', 'ê': 'e', 'ë': 'e', 'â': 'a', 'û': 'u'}
2015-01-26 23:06:46 +01:00
question(2)
2015-02-03 10:47:19 +01:00
def bas_casse_sans_accent(chaine):
""" str -> str, renvoie une chaine qui est l'équivalent non accentuée et minuscule de la chaine passée en paramètre
CU: chaine est un str
"""
2015-02-03 10:47:19 +01:00
assert(type(chaine) == str)
2015-02-03 10:47:19 +01:00
chaineCpy = chaine.lower()
ret = ""
for i in chaineCpy:
if i in EQUIV_NON_ACCENTUE:
ret += EQUIV_NON_ACCENTUE[i]
else:
ret += i
return ret
2015-01-26 23:06:46 +01:00
question(3)
2015-02-03 10:47:19 +01:00
def sont_anagrammes_sans_casse_ni_accent(chaine1, chaine2):
""" Prédicat, renvoie True si chaine1 et chaine2 sont des anagrammes, False sinon, ne tient pas compte de la casse ou des accents
str, str -> bool
CU: chaine1 et chaine2 sont des str
"""
2015-02-03 10:47:19 +01:00
assert(type(chaine1) == str and type(chaine2) == str)
2015-02-03 10:47:19 +01:00
# Si la longueur est différente ca ne peut pas être des anagrammes
if len(chaine1) != len(chaine2):
return False
chaine1Cpy = bas_casse_sans_accent(chaine1)
chaine2Cpy = bas_casse_sans_accent(chaine2)
return sont_anagrammes2(chaine1Cpy, chaine2Cpy)
2015-01-26 23:06:46 +01:00
2015-02-03 10:47:19 +01:00
partie('Recherche d\'anagrammes') # Jean-loup
2015-01-26 23:06:46 +01:00
section('Le lexique')
question(2)
2015-01-27 11:46:52 +01:00
from lexique import *
2015-01-26 23:06:46 +01:00
question(3)
2015-01-27 11:46:52 +01:00
print('Il y a', len(LEXIQUE), 'mots dans le lexique')
2015-01-26 23:06:46 +01:00
question(4)
2015-01-27 11:46:52 +01:00
ens = set(LEXIQUE)
if len(ens) != len(LEXIQUE):
print('Il y a des doublons')
else:
print('Il n \' y a pas de doublons')
2015-01-26 23:06:46 +01:00
section('Anagrammes d\'un mot : première méthode')
2015-01-26 23:06:46 +01:00
question(1)
2015-02-03 10:47:19 +01:00
2015-01-27 11:46:52 +01:00
def anagrammes(mot):
""" str -> list de str, parcourt tout le lexique et recherche les anagrammes de mot
CU: mot est un str
"""
2015-02-03 10:47:19 +01:00
assert(type(mot) == str)
2015-01-27 11:46:52 +01:00
anag = []
for i in LEXIQUE:
if sont_anagrammes_sans_casse_ni_accent(i, mot):
anag.append(i)
return anag
2015-01-26 23:06:46 +01:00
question(2)
print('Les anagrammes de Orange sont:', anagrammes('Orange'))
print('Les anagrammes de Calbuth sont:', anagrammes('Calbuth'))
2015-01-26 23:06:46 +01:00
section('Anagrammes d\'un mot : seconde méthode')
2015-01-26 23:06:46 +01:00
question(1)
2015-02-03 10:47:19 +01:00
# Il se peut que certains mots du lexique soient des anagrammes d'autres
# mots du lexique, or on se retrouverait alors avec plusieurs fois la même
# liste d'anagrammes pour des clés différentes.
2015-01-27 11:46:52 +01:00
2015-01-26 23:06:46 +01:00
question(2)
2015-02-03 10:47:19 +01:00
def cle(mot):
""" str -> str , renvoie la version triée des lettres de mot, sans accent et en bas de casse.
CU: mot est un str
"""
2015-02-03 10:47:19 +01:00
assert(type(mot) == str)
cpy = bas_casse_sans_accent(mot)
return sort(cpy)
2015-01-26 23:06:46 +01:00
question(3)
ANAGRAMMES = dict()
for i in LEXIQUE:
k = cle(i)
if not k in ANAGRAMMES:
ANAGRAMMES[k]=[i]
else:
ANAGRAMMES[k]= ANAGRAMMES[k] + [i]
print(len(ANAGRAMMES))
2015-01-26 23:06:46 +01:00
question(4)
2015-02-03 10:47:19 +01:00
def anagrammes2(mot):
""" str -> list de str, utilise le dictionnaire ANAGRAMMES pour trouver la liste des anagrammes de mot
CU: mot est un str
"""
k = cle(mot)
if k in ANAGRAMMES:
return ANAGRAMMES[k]
else:
return []
2015-01-26 23:06:46 +01:00
question(5)
print('Les anagrammes de Orange sont:', anagrammes2('Orange'))
print('Les anagrammes de Calbuth sont:', anagrammes2('Calbuth'))
2015-01-26 23:06:46 +01:00
section('Comparaison des deux méthodes')
question(1)
# import time
# debut = time.time()
# for i in range(30):
# anagrammes(LEXIQUE[i])
# temps1 = time.time() - debut
# debut = time.time()
2015-02-03 10:59:16 +01:00
# for i in range(30):
# anagrammes2(LEXIQUE[i])
# temps2 = time.time() - debut
# print('La première méthode à mis %s secondes, et la deuxième %s secondes' %(temps1,temps2))
2015-01-26 23:06:46 +01:00
# partie('Phrases d\'anagrammes') # Geoffrey
2015-01-26 23:06:46 +01:00
# question(1)
2015-01-26 23:06:46 +01:00
2015-02-03 10:50:19 +01:00
# def arbre_vers_liste(arbre):
# # [[1, [3, [4]]], [2, [3, [4]]]] ⇒ [[1, 3], [1, 4], [2, 3], [2, 4]]
# print(arbre)
# possibilites = []
# # for i in arbre:
2015-02-03 11:24:44 +01:00
# return possibilites
2015-02-03 11:24:44 +01:00
# def annagrammes_arbre(liste):
# # TODO Docstring
# anagrammesPremier = anagrammes(liste[0])
# if len(liste) > 1: # Si il y a des anagrammes après
# res = []
# for i in anagrammesPremier:
# res.append([i, annagrammes_arbre(liste[1:])])
# return res
# else:
# return anagrammesPremier
2015-02-03 11:24:44 +01:00
# def developpement(mots):
# # [[1, 2], [3, 4]] ⇒ [[1, 3], [1, 4], [2, 3], [2, 4]]
# # TODO Docstring
# for annagrammes in mots:
# for annagramme in annagrammes:
# return False
2015-02-03 10:50:19 +01:00
2015-01-27 11:45:34 +01:00
# def annagrammes_phrase(phrase):
# # TODO Docstring
# mots = phrase.split()
# anagrammesArbre = annagrammes_arbre(mots)
# annagrammesMots = [anagrammes(i) for i in mots]
# return arbre_vers_liste(anagrammesArbre)
# print(annagrammes_phrase('orange orange orange')) # DEBUG
2015-01-27 11:45:34 +01:00
partie('Sauvegarde et récupération')
2015-02-03 10:52:49 +01:00
ANAGRAMMES_FICHIER = 'anagrammes.txt'
question(1)
def sauver_dico():
f = open(ANAGRAMMES_FICHIER, 'w')
for i in ANAGRAMMES:
f.write(i + ':' + ':'.join(ANAGRAMMES[i]) + '\n')
f.close()
question(2)
sauver_dico()
from os.path import getsize
taille = getsize(ANAGRAMMES_FICHIER)
print('Le dictionnaire fait %d octets, soit %0.3f Mio.' % (taille, taille/1024/1024))
question(3)
def charger_dico():
ANAGRAMMES = dict()
f = open(ANAGRAMMES_FICHIER, 'r')
for l in f:
decoupe = ':'.split(str(f))
ANAGRAMMES[decoupe[0]] = decoupe[1:]
f.close()