2015-02-09 18:40:01 +01:00
|
|
|
# PREUD'HOMME Geoffrey
|
2015-01-26 23:06:46 +01:00
|
|
|
# BEAUSSART Jean-loup
|
2015-02-08 20:35:45 +01:00
|
|
|
# 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):
|
2015-02-09 18:40:01 +01:00
|
|
|
print('\n', nom, '=' * len(nom), sep='\n')
|
2015-01-26 23:06:46 +01:00
|
|
|
|
|
|
|
|
|
|
|
def section(nom):
|
2015-02-09 18:40:01 +01:00
|
|
|
print('\n', nom, '-' * len(nom), sep='\n')
|
2015-01-26 23:06:46 +01:00
|
|
|
|
|
|
|
|
|
|
|
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-02-09 19:49:10 +01:00
|
|
|
|
2015-01-27 10:51:45 +01:00
|
|
|
section('Méthode split')
|
|
|
|
|
2015-01-26 23:06:46 +01:00
|
|
|
question(1)
|
2015-02-09 11:24:53 +01:00
|
|
|
print(">>> s = 'la méthode split est parfois bien utile'")
|
|
|
|
s = 'la méthode split est parfois bien utile'
|
|
|
|
print(">>> s.split (' ')")
|
2015-02-09 12:04:12 +01:00
|
|
|
print(s.split(' '))
|
2015-02-09 11:24:53 +01:00
|
|
|
print(">>> s.split ('e')")
|
2015-02-09 12:04:12 +01:00
|
|
|
print(s.split('e'))
|
2015-02-09 11:24:53 +01:00
|
|
|
print(">>> s.split ('é')")
|
2015-02-09 12:04:12 +01:00
|
|
|
print(s.split('é'))
|
2015-02-09 11:24:53 +01:00
|
|
|
print(">>> s.split ()")
|
2015-02-09 12:04:12 +01:00
|
|
|
print(s.split())
|
2015-02-09 11:24:53 +01:00
|
|
|
print(">>> s.split ('')")
|
|
|
|
print('ValueError: empty separator')
|
|
|
|
print(">>> s.split ('split')")
|
2015-02-09 12:04:12 +01:00
|
|
|
print(s.split('split'))
|
2015-01-27 10:50:06 +01:00
|
|
|
|
2015-01-26 23:06:46 +01:00
|
|
|
question(2)
|
2015-02-09 19:51:25 +01:00
|
|
|
print('La méthode `split` renvoie la liste des chaînes de la découpe de la chaîne sur laquelle est \
|
|
|
|
appliquée la fonction par la chaîne passée en argument (ou à défaut le caractères d\'espacement')
|
2015-01-26 23:06:46 +01:00
|
|
|
|
|
|
|
question(3)
|
2015-02-09 11:24:53 +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')
|
2015-02-09 12:04:12 +01:00
|
|
|
print('\'' + s + '\'')
|
2015-01-26 23:06:46 +01:00
|
|
|
|
2015-02-09 19:51:25 +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)
|
2015-02-09 11:24:53 +01:00
|
|
|
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)')
|
2015-02-09 12:04:12 +01:00
|
|
|
print("".join(l))
|
2015-02-09 11:24:53 +01:00
|
|
|
print('>>> " ".join (l)')
|
2015-02-09 12:04:12 +01:00
|
|
|
print(" ".join(l))
|
2015-02-09 11:24:53 +01:00
|
|
|
print('>>> ";".join (l)')
|
2015-02-09 12:04:12 +01:00
|
|
|
print(";".join(l))
|
2015-02-09 11:24:53 +01:00
|
|
|
print('>>> " tralala ".join (l)')
|
2015-02-09 12:04:12 +01:00
|
|
|
print(" tralala ".join(l))
|
2015-02-09 11:24:53 +01:00
|
|
|
print('>>> "\n".join (l)')
|
2015-02-09 12:04:12 +01:00
|
|
|
print("\n".join(l))
|
2015-02-09 11:24:53 +01:00
|
|
|
print('>>> "".join (s)')
|
2015-02-09 12:04:12 +01:00
|
|
|
print("".join(s))
|
2015-02-09 11:24:53 +01:00
|
|
|
print('>>> "!".join (s)')
|
2015-02-09 12:04:12 +01:00
|
|
|
print("!".join(s))
|
2015-02-09 11:24:53 +01:00
|
|
|
print('>>> "".join ()')
|
|
|
|
print('TypeError: join() takes exactly one argument (0 given)')
|
|
|
|
print('>>> "".join ([])')
|
2015-02-09 12:04:12 +01:00
|
|
|
print("".join([]))
|
2015-02-09 11:24:53 +01:00
|
|
|
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-09 19:51:25 +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)
|
2015-02-09 11:24:53 +01:00
|
|
|
print('>>> chaine = \'!\'')
|
|
|
|
chaine = '!'
|
|
|
|
print('>>> chaine.join(l)')
|
|
|
|
print(chaine.join(l))
|
|
|
|
print('>>> chaine')
|
2015-02-09 12:04:12 +01:00
|
|
|
print('\'' + chaine + '\'')
|
2015-01-27 11:03:08 +01:00
|
|
|
|
|
|
|
|
2015-02-09 19:51:25 +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-09 19:51:25 +01:00
|
|
|
|
|
|
|
|
2015-01-27 11:03:08 +01:00
|
|
|
def join(chaine, sequence):
|
2015-02-09 19:47:21 +01:00
|
|
|
"""
|
2015-02-09 19:51:25 +01:00
|
|
|
Retourne la concaténation des éléments de séquence en insérant chaine entre eux.
|
2015-02-09 19:47:21 +01:00
|
|
|
str, [str *] → str
|
|
|
|
"""
|
2015-02-03 10:47:19 +01:00
|
|
|
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-02-09 19:49:10 +01:00
|
|
|
|
2015-01-27 11:17:24 +01:00
|
|
|
section('Méthode sort')
|
2015-01-26 23:06:46 +01:00
|
|
|
|
|
|
|
question(1)
|
2015-02-09 11:24:53 +01:00
|
|
|
print('>>> l = list (\'timoleon\')')
|
2015-02-09 12:04:12 +01:00
|
|
|
l = list('timoleon')
|
2015-02-09 11:24:53 +01:00
|
|
|
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
|
|
|
|
2015-02-09 11:24:53 +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)')
|
2015-02-09 12:04:12 +01:00
|
|
|
l = list(s)
|
2015-02-09 11:24:53 +01:00
|
|
|
print('>>> l.sort()')
|
|
|
|
l.sort()
|
|
|
|
print('>>> l')
|
|
|
|
print(l)
|
2015-01-27 11:02:24 +01:00
|
|
|
|
2015-02-09 19:51:25 +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-09 19:51:25 +01:00
|
|
|
print('Il semblerait que la méthode 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)
|
2015-02-09 11:24:53 +01:00
|
|
|
print('>>> l = [\'a\', 1]')
|
|
|
|
print('>>> l.sort()')
|
|
|
|
print('TypeError: unorderable types: int() < str()')
|
2015-01-27 11:02:24 +01:00
|
|
|
|
2015-02-09 19:51:25 +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 méthode 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-09 19:51:25 +01:00
|
|
|
|
|
|
|
|
2015-01-27 11:25:40 +01:00
|
|
|
def sort(chaine):
|
2015-02-09 19:47:21 +01:00
|
|
|
"""
|
|
|
|
Trie les caractères de chaine par ordre de codage.
|
|
|
|
str → str
|
|
|
|
"""
|
2015-02-09 19:11:36 +01:00
|
|
|
t = list(chaine)
|
|
|
|
t.sort()
|
|
|
|
return ''.join(t)
|
2015-01-27 11:25:40 +01:00
|
|
|
|
|
|
|
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-09 19:51:25 +01:00
|
|
|
|
|
|
|
|
2015-02-03 10:43:38 +01:00
|
|
|
def sont_anagrammes1(chaine1, chaine2):
|
2015-02-09 17:29:39 +01:00
|
|
|
"""
|
|
|
|
Indique si chaine1 et chaine2 sont anagrammes
|
|
|
|
str, str → bool
|
|
|
|
CU : chaine1 et chaine2 sont des str
|
2015-01-27 11:02:24 +01:00
|
|
|
"""
|
|
|
|
|
2015-02-09 18:40:01 +01:00
|
|
|
assert(type(chaine1) == type(chaine2) ==
|
|
|
|
str), 'chaine1 et chaine2 doivent être des str'
|
2015-01-27 11:02:24 +01:00
|
|
|
|
2015-02-09 17:29:39 +01:00
|
|
|
# Si la longueur est différente, ça ne peut pas être des anagrammes
|
2015-02-03 10:47:19 +01:00
|
|
|
if len(chaine1) != len(chaine2):
|
2015-01-27 11:02:24 +01:00
|
|
|
return False
|
|
|
|
|
2015-02-03 11:43:40 +01:00
|
|
|
c1 = sort(chaine1)
|
|
|
|
c2 = sort(chaine2)
|
2015-01-27 11:02:24 +01:00
|
|
|
|
2015-02-03 11:43:40 +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-09 19:51:25 +01:00
|
|
|
|
|
|
|
|
2015-01-27 11:02:24 +01:00
|
|
|
def sont_anagrammes2(chaine1, chaine2):
|
2015-02-09 17:29:39 +01:00
|
|
|
"""
|
|
|
|
Indique si chaine1 et chaine2 sont anagrammes
|
|
|
|
str, str → bool
|
|
|
|
CU : chaine1 et chaine2 sont des str
|
2015-01-27 11:02:24 +01:00
|
|
|
"""
|
|
|
|
|
2015-02-09 18:40:01 +01:00
|
|
|
assert(type(chaine1) == type(chaine2) ==
|
|
|
|
str), 'chaine1 et chaine2 doivent être des str'
|
2015-01-27 11:02:24 +01:00
|
|
|
|
2015-02-09 17:29:39 +01:00
|
|
|
# Si la longueur est différente, ça ne peut pas être des anagrammes
|
2015-02-03 10:47:19 +01:00
|
|
|
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-09 19:51:25 +01:00
|
|
|
|
|
|
|
|
2015-02-03 10:43:38 +01:00
|
|
|
def sont_anagrammes3(chaine1, chaine2):
|
2015-02-09 17:29:39 +01:00
|
|
|
"""
|
|
|
|
Indique si chaine1 et chaine2 sont anagrammes
|
|
|
|
str, str → bool
|
|
|
|
CU : chaine1 et chaine2 sont des str
|
2015-01-27 11:02:24 +01:00
|
|
|
"""
|
|
|
|
|
2015-02-09 18:40:01 +01:00
|
|
|
assert(type(chaine1) == type(chaine2) ==
|
|
|
|
str), 'chaine1 et chaine2 doivent être des str'
|
2015-01-27 11:02:24 +01:00
|
|
|
|
2015-02-09 17:29:39 +01:00
|
|
|
# Si la longueur est différente, ça ne peut pas être des anagrammes
|
2015-02-03 10:47:19 +01:00
|
|
|
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)
|
2015-02-09 19:32:04 +01:00
|
|
|
EQUIV_NON_ACCENTUE = {'é': 'e', 'è': 'e', 'à': 'a', 'ç': 'c', 'î': 'i', 'ï':
|
|
|
|
'i', 'ô': 'o', 'ê': 'e', 'ë': 'e', 'â': 'a', 'û': 'u', 'ü': 'u', 'ù': 'u'}
|
2015-01-27 11:24:38 +01:00
|
|
|
|
2015-01-26 23:06:46 +01:00
|
|
|
question(2)
|
2015-02-09 19:51:25 +01:00
|
|
|
|
|
|
|
|
2015-01-27 11:24:38 +01:00
|
|
|
def bas_casse_sans_accent(chaine):
|
2015-02-09 17:29:39 +01:00
|
|
|
"""
|
|
|
|
Renvoie l'équivalent minuscule non accentuée de la chaîne passée en paramètre
|
|
|
|
str → str
|
|
|
|
CU : chaine est un str
|
2015-01-27 11:24:38 +01:00
|
|
|
"""
|
|
|
|
|
2015-02-09 17:29:39 +01:00
|
|
|
assert(type(chaine) == str), 'chaine doit être un str'
|
2015-01-27 11:24:38 +01:00
|
|
|
|
2015-02-03 10:47:19 +01:00
|
|
|
chaineCpy = chaine.lower()
|
2015-01-27 11:24:38 +01:00
|
|
|
|
|
|
|
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-09 19:51:25 +01:00
|
|
|
|
|
|
|
|
2015-01-27 11:24:38 +01:00
|
|
|
def sont_anagrammes_sans_casse_ni_accent(chaine1, chaine2):
|
2015-02-09 17:29:39 +01:00
|
|
|
"""
|
|
|
|
Indique si chaine1 et chaine2 sont anagrammes sans de tenir compte de la casse ni des accents
|
|
|
|
str, str → bool
|
|
|
|
CU : chaine1 et chaine2 sont des str
|
2015-01-27 11:24:38 +01:00
|
|
|
"""
|
|
|
|
|
2015-02-09 18:40:01 +01:00
|
|
|
assert(type(chaine1) == type(chaine2) ==
|
|
|
|
str), 'chaine1 et chaine2 doivent être des str'
|
2015-01-27 11:24:38 +01:00
|
|
|
|
2015-02-09 17:29:39 +01:00
|
|
|
# Si la longueur est différente, ça ne peut pas être des anagrammes
|
2015-02-03 10:47:19 +01:00
|
|
|
if len(chaine1) != len(chaine2):
|
2015-01-27 11:24:38 +01:00
|
|
|
return False
|
|
|
|
|
|
|
|
chaine1Cpy = bas_casse_sans_accent(chaine1)
|
|
|
|
chaine2Cpy = bas_casse_sans_accent(chaine2)
|
|
|
|
|
2015-02-09 18:40:01 +01:00
|
|
|
return sont_anagrammes2(chaine1Cpy, chaine2Cpy)
|
2015-01-27 11:24:38 +01:00
|
|
|
|
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')
|
|
|
|
|
2015-02-09 19:52:18 +01:00
|
|
|
question(1)
|
2015-02-09 18:18:14 +01:00
|
|
|
|
2015-01-26 23:06:46 +01:00
|
|
|
question(2)
|
2015-01-27 11:46:52 +01:00
|
|
|
from lexique import *
|
|
|
|
|
2015-01-26 23:06:46 +01:00
|
|
|
question(3)
|
2015-02-09 17:41:15 +01:00
|
|
|
print('Il y a %d mots dans le lexique' % len(LEXIQUE))
|
2015-01-27 11:46:52 +01:00
|
|
|
|
2015-01-26 23:06:46 +01:00
|
|
|
question(4)
|
2015-02-09 18:04:00 +01:00
|
|
|
test = len(LEXIQUE) == len(set(LEXIQUE))
|
|
|
|
# Bien que l'on ai vu en cours que cette méthode n'est pas la plus économique en mémoire, c'est
|
|
|
|
# bizarrement la plus rapide
|
2015-02-09 17:41:15 +01:00
|
|
|
print('Le test a retourné %s.' % test)
|
2015-01-26 23:06:46 +01:00
|
|
|
|
2015-02-09 19:49:10 +01:00
|
|
|
|
2015-02-08 20:35:45 +01:00
|
|
|
section('Anagrammes d\'un mot : première méthode')
|
2015-01-26 23:06:46 +01:00
|
|
|
|
|
|
|
question(1)
|
2015-02-09 19:51:25 +01:00
|
|
|
|
|
|
|
|
2015-01-27 11:46:52 +01:00
|
|
|
def anagrammes(mot):
|
2015-02-09 17:47:53 +01:00
|
|
|
"""
|
|
|
|
Recherche les anagrammes de mot
|
|
|
|
str → [str *]
|
|
|
|
CU : mot est un str
|
2015-01-27 11:46:52 +01:00
|
|
|
"""
|
|
|
|
|
2015-02-09 17:47:53 +01:00
|
|
|
assert(type(mot) == str), 'mot doit être un str'
|
2015-01-27 11:46:52 +01:00
|
|
|
|
2015-02-09 17:47:53 +01:00
|
|
|
return [i for i in LEXIQUE if sont_anagrammes_sans_casse_ni_accent(i, mot)]
|
2015-01-27 11:46:52 +01:00
|
|
|
|
2015-01-26 23:06:46 +01:00
|
|
|
question(2)
|
2015-02-09 17:47:53 +01:00
|
|
|
for a in ['Orange', 'Calbuth']:
|
|
|
|
print('Les anagrammes de %s sont %s.' % (a, ', '.join(anagrammes(a))))
|
2015-01-26 23:06:46 +01:00
|
|
|
|
2015-02-09 19:49:10 +01:00
|
|
|
|
2015-02-08 20:35:45 +01:00
|
|
|
section('Anagrammes d\'un mot : seconde méthode')
|
2015-01-26 23:06:46 +01:00
|
|
|
|
|
|
|
question(1)
|
2015-02-09 18:18:14 +01:00
|
|
|
print('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-09 19:51:25 +01:00
|
|
|
|
|
|
|
|
2015-02-03 10:46:00 +01:00
|
|
|
def cle(mot):
|
2015-02-09 18:18:14 +01:00
|
|
|
"""
|
|
|
|
Renvoie la version triée des lettres en minuscule et sans accents de mot
|
|
|
|
str → str
|
|
|
|
CU : mot est un str
|
2015-02-03 10:46:00 +01:00
|
|
|
"""
|
|
|
|
|
2015-02-09 18:18:14 +01:00
|
|
|
assert(type(mot) == str), 'mot doit être un str'
|
2015-02-03 10:46:00 +01:00
|
|
|
|
2015-02-08 20:35:45 +01:00
|
|
|
cpy = bas_casse_sans_accent(mot)
|
2015-02-03 10:46:00 +01:00
|
|
|
|
2015-02-08 20:35:45 +01:00
|
|
|
return sort(cpy)
|
2015-02-03 10:46:00 +01:00
|
|
|
|
2015-01-26 23:06:46 +01:00
|
|
|
question(3)
|
2015-02-03 11:28:03 +01:00
|
|
|
ANAGRAMMES = dict()
|
|
|
|
|
2015-02-09 19:11:36 +01:00
|
|
|
for m in LEXIQUE:
|
|
|
|
k = cle(m)
|
2015-02-08 20:35:45 +01:00
|
|
|
if not k in ANAGRAMMES:
|
2015-02-09 19:11:36 +01:00
|
|
|
ANAGRAMMES[k] = [m]
|
2015-02-08 20:35:45 +01:00
|
|
|
else:
|
2015-02-09 19:11:36 +01:00
|
|
|
ANAGRAMMES[k] = ANAGRAMMES[k] + [m]
|
2015-02-03 11:28:03 +01:00
|
|
|
|
2015-02-03 10:46:00 +01:00
|
|
|
|
2015-02-09 18:18:14 +01:00
|
|
|
print('Le dictionnaire des anagrammes contient %d entrées' % len(ANAGRAMMES))
|
2015-02-03 10:46:00 +01:00
|
|
|
|
2015-01-26 23:06:46 +01:00
|
|
|
question(4)
|
2015-02-09 19:51:25 +01:00
|
|
|
|
|
|
|
|
2015-02-03 10:46:00 +01:00
|
|
|
def anagrammes2(mot):
|
2015-02-09 18:18:14 +01:00
|
|
|
"""
|
|
|
|
Recherche les anagrammes de mot
|
|
|
|
str → [str *]
|
|
|
|
CU : mot est un str
|
2015-02-03 10:46:00 +01:00
|
|
|
"""
|
|
|
|
|
2015-02-09 18:18:14 +01:00
|
|
|
assert(type(mot) == str), 'mot doit être un str'
|
|
|
|
|
2015-02-03 10:46:00 +01:00
|
|
|
k = cle(mot)
|
|
|
|
|
|
|
|
if k in ANAGRAMMES:
|
|
|
|
return ANAGRAMMES[k]
|
|
|
|
else:
|
|
|
|
return []
|
|
|
|
|
2015-01-26 23:06:46 +01:00
|
|
|
question(5)
|
2015-02-09 18:18:14 +01:00
|
|
|
for a in ['Orange', 'Calbuth']:
|
|
|
|
print('Les anagrammes de %s sont %s.' % (a, ', '.join(anagrammes2(a))))
|
2015-02-03 10:46:00 +01:00
|
|
|
|
2015-01-26 23:06:46 +01:00
|
|
|
|
|
|
|
section('Comparaison des deux méthodes')
|
|
|
|
|
|
|
|
question(1)
|
2015-02-09 19:47:21 +01:00
|
|
|
NB_TESTS = 30 # Mettre à 0 pour réduire l'attente
|
2015-02-09 18:40:01 +01:00
|
|
|
|
2015-02-09 12:03:16 +01:00
|
|
|
import time
|
2015-02-08 20:35:45 +01:00
|
|
|
|
2015-02-09 12:03:16 +01:00
|
|
|
debut = time.time()
|
2015-02-09 19:11:36 +01:00
|
|
|
for t in range(NB_TESTS):
|
|
|
|
anagrammes(LEXIQUE[t])
|
2015-02-09 12:03:16 +01:00
|
|
|
temps1 = time.time() - debut
|
2015-02-08 20:35:45 +01:00
|
|
|
|
2015-02-09 12:03:16 +01:00
|
|
|
debut = time.time()
|
2015-02-09 19:11:36 +01:00
|
|
|
for t in range(NB_TESTS):
|
|
|
|
anagrammes2(LEXIQUE[t])
|
2015-02-09 12:03:16 +01:00
|
|
|
temps2 = time.time() - debut
|
2015-02-08 20:35:45 +01:00
|
|
|
|
2015-02-09 18:40:01 +01:00
|
|
|
print('La première méthode a duré %s secondes, et la deuxième %s secondes.' % (temps1, temps2),
|
2015-02-09 19:47:21 +01:00
|
|
|
'La deuxième méthode est %0.2f fois plus efficace que la première.' % (
|
|
|
|
temps1 / temps2),
|
2015-02-09 18:40:01 +01:00
|
|
|
'En effet, la première vérifie %d combinaisons d\'anagrammes, alors que la deuxième ne \
|
|
|
|
réalise qu\'un accès à un dictionnaire. Notons que la construction dudit dictionnaire a lui aussi \
|
|
|
|
pris un certain temps, mais reste négligeable par rapport à la première méthode.' % len(LEXIQUE),
|
|
|
|
sep='\n')
|
2015-01-26 23:06:46 +01:00
|
|
|
|
2015-02-09 12:03:16 +01:00
|
|
|
partie('Phrases d\'anagrammes') # Geoffrey
|
2015-01-26 23:06:46 +01:00
|
|
|
|
2015-02-09 12:03:16 +01:00
|
|
|
question(1)
|
2015-02-09 19:47:21 +01:00
|
|
|
|
2015-02-09 18:46:56 +01:00
|
|
|
def liste_possibilites(arbre, precede):
|
2015-02-09 19:47:21 +01:00
|
|
|
"""
|
|
|
|
Renvoie la liste des possibilités à partir d'un arbre de possibilités.
|
|
|
|
dict, list → list
|
2015-02-09 19:51:25 +01:00
|
|
|
|
2015-02-09 19:47:21 +01:00
|
|
|
>>> liste_possibilites(annagrammes_arbre(['mange', 'ton']), [])
|
|
|
|
[['mange', 'ton'], ['mange', 'ont'], ['mangé', 'ton'], ['mangé', 'ont']]
|
|
|
|
"""
|
2015-02-09 12:03:16 +01:00
|
|
|
possibilites = []
|
2015-02-09 19:11:36 +01:00
|
|
|
for branche in arbre:
|
|
|
|
if type(arbre[branche]) == dict:
|
2015-02-09 18:46:56 +01:00
|
|
|
possibilites = possibilites + \
|
2015-02-09 19:11:36 +01:00
|
|
|
liste_possibilites(arbre[branche], precede + [branche])
|
|
|
|
elif arbre[branche] == None:
|
|
|
|
possibilites = possibilites + [precede + [branche]]
|
2015-02-09 12:03:16 +01:00
|
|
|
return possibilites
|
2015-02-03 11:24:44 +01:00
|
|
|
|
2015-02-09 12:04:12 +01:00
|
|
|
|
2015-02-09 12:03:16 +01:00
|
|
|
def annagrammes_arbre(liste):
|
2015-02-09 19:47:21 +01:00
|
|
|
"""
|
|
|
|
Renvoie l'arbre des anagrammes possibles à partir d'une liste de mots.
|
|
|
|
list → dict
|
|
|
|
|
|
|
|
>>> annagrammes_arbre(['mange', 'ton'])
|
|
|
|
{'mange': {'ton': None, 'ont': None}, 'mangé': {'ton': None, 'ont': None}}
|
|
|
|
"""
|
2015-02-09 19:53:20 +01:00
|
|
|
anagrammesPremier = anagrammes2(liste[0])
|
2015-02-09 12:03:16 +01:00
|
|
|
if len(liste) > 1: # Si il y a des anagrammes après
|
2015-02-09 18:46:56 +01:00
|
|
|
return dict((i, annagrammes_arbre(liste[1:])) for i in anagrammesPremier)
|
2015-02-09 12:03:16 +01:00
|
|
|
else:
|
2015-02-09 13:21:21 +01:00
|
|
|
return dict((i, None) for i in anagrammesPremier)
|
2015-02-03 11:24:44 +01:00
|
|
|
|
2015-02-09 12:04:12 +01:00
|
|
|
|
2015-02-09 12:03:16 +01:00
|
|
|
def annagrammes_phrase(phrase):
|
2015-02-09 19:47:21 +01:00
|
|
|
"""
|
|
|
|
Renvoie la liste des anagrammes possibles à partir d'une phrase.
|
|
|
|
str → str
|
|
|
|
|
|
|
|
>>> annagrammes_phrase('mange ton')
|
|
|
|
['mange ton', 'mange ont', 'mangé ton', 'mangé ont']
|
|
|
|
"""
|
2015-02-09 12:03:16 +01:00
|
|
|
mots = phrase.split()
|
2015-02-09 18:46:56 +01:00
|
|
|
arbre = annagrammes_arbre(mots)
|
|
|
|
liste = liste_possibilites(arbre, [])
|
2015-02-09 13:21:21 +01:00
|
|
|
return [' '.join(i) for i in liste]
|
|
|
|
|
2015-02-09 18:46:56 +01:00
|
|
|
print('>>> annagrammes_phrase(\'Mange ton orange\')')
|
|
|
|
print(annagrammes_phrase('Mange ton orange'))
|
2015-01-27 11:45:34 +01:00
|
|
|
|
2015-02-09 19:49:10 +01:00
|
|
|
|
2015-02-09 12:02:00 +01:00
|
|
|
partie('Sauvegarde et récupération')
|
2015-02-03 10:52:49 +01:00
|
|
|
|
2015-02-09 12:02:00 +01:00
|
|
|
ANAGRAMMES_FICHIER = 'anagrammes.txt'
|
|
|
|
|
|
|
|
question(1)
|
2015-02-09 19:51:25 +01:00
|
|
|
|
|
|
|
|
2015-02-09 12:02:00 +01:00
|
|
|
def sauver_dico():
|
2015-02-09 19:47:21 +01:00
|
|
|
"""
|
|
|
|
Sauvegarde le dictionnaire des anagrammes dans un fichier.
|
|
|
|
∅ → ∅
|
|
|
|
"""
|
2015-02-09 19:11:36 +01:00
|
|
|
fichier = open(ANAGRAMMES_FICHIER, 'w')
|
2015-02-09 12:02:00 +01:00
|
|
|
for i in ANAGRAMMES:
|
2015-02-09 19:11:36 +01:00
|
|
|
fichier.write(i + ':' + ':'.join(ANAGRAMMES[i]) + '\n')
|
|
|
|
fichier.close()
|
2015-02-09 12:02:00 +01:00
|
|
|
|
|
|
|
question(2)
|
|
|
|
sauver_dico()
|
|
|
|
from os.path import getsize
|
|
|
|
taille = getsize(ANAGRAMMES_FICHIER)
|
2015-02-09 12:04:12 +01:00
|
|
|
print('Le dictionnaire fait %d octets, soit %0.3f Mio.' %
|
|
|
|
(taille, taille / 1024 / 1024))
|
2015-02-09 12:02:00 +01:00
|
|
|
|
|
|
|
question(3)
|
2015-02-09 19:51:25 +01:00
|
|
|
|
|
|
|
|
2015-02-09 12:02:00 +01:00
|
|
|
def charger_dico():
|
2015-02-09 19:47:21 +01:00
|
|
|
"""
|
|
|
|
Lit le dictionnaire des anagrammes depuis un fichier.
|
|
|
|
∅ → ∅
|
|
|
|
"""
|
2015-02-09 12:02:00 +01:00
|
|
|
ANAGRAMMES = dict()
|
2015-02-09 19:11:36 +01:00
|
|
|
fichier = open(ANAGRAMMES_FICHIER, 'r')
|
|
|
|
for ligne in fichier:
|
|
|
|
decoupe = ':'.split(str(ligne))
|
2015-02-09 12:02:00 +01:00
|
|
|
ANAGRAMMES[decoupe[0]] = decoupe[1:]
|
2015-02-09 19:11:36 +01:00
|
|
|
fichier.close()
|