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

344 lines
8.7 KiB
Python
Raw Normal View History

2015-01-26 23:06:46 +01:00
# PREUD'HOMME Geoffrey
# BEAUSSART Jean-loup
# Donné le 27/01/201question(5)
# 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-01-27 10:32:05 +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)
2015-01-27 10:50:06 +01:00
# TODO utf-8
# TODO en print
##>>> s = 'la méthode split est parfois bien utile'
##>>> s.split (' ')
##['la', 'm\xc3\xa9thode', 'split', 'est', 'parfois', 'bien', 'utile']
##>>> s.split ('e')
##['la m\xc3\xa9thod', ' split ', 'st parfois bi', 'n util', '']
##>>> s.split ('é')
##['la m', 'thode split est parfois bien utile']
##>>> s.split ()
##['la', 'm\xc3\xa9thode', 'split', 'est', 'parfois', 'bien', 'utile']
##>>> s.split ('')
##Traceback (most recent call last):
## File "<stdin>", line 1, in <module>
##ValueError: empty separator
##>>> s.split ('split')
##['la m\xc3\xa9thode ', ' est parfois bien utile']
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-01-27 11:03:08 +01:00
print('La méthode `split` appliquée à une chaîne de caractères renvoie une liste de châines 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ère 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
2015-01-27 10:50:06 +01:00
##>>> s = "la méthode split est parfois bien utile"
##>>> s.split(' ')
##['la', 'm\xc3\xa9thode', 'split', 'est', 'parfois', 'bien', 'utile']
##>>> s
##'la m\xc3\xa9thode split est parfois bien utile'
2015-01-26 23:06:46 +01:00
2015-01-27 11:03:08 +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ère à laquelle elle s\'applique (ce qui est logique vu le caractère non-mutable des chaînes de caractère')
2015-01-26 23:06:46 +01:00
section('Méthode join')
question(1)
2015-01-27 11:03:08 +01:00
# TODO utf-8
# TODO en print
##>>> l = s.split()
##'lam\xc3\xa9thodesplitestparfoisbienutile'
##>>> " ".join (l)
##'la m\xc3\xa9thode split est parfois bien utile'
##>>> ";".join (l)
##'la;m\xc3\xa9thode;split;est;parfois;bien;utile'
##>>> " tralala ".join (l)
##'la tralala m\xc3\xa9thode tralala split tralala est tralala parfois tralala bien tralala utile'
##>>> print ("\n".join (l))
##la
##méthode
##split
##est
##parfois
##bien
##utile
##>>> "".join (s)
##'la m\xc3\xa9thode split est parfois bien utile'
##>>> "!".join (s)
##'l!a! !m!\xc3!\xa9!t!h!o!d!e! !s!p!l!i!t! !e!s!t! !p!a!r!f!o!i!s! !b!i!e!n! !u!t!i!l!e'
##>>> "".join ()
##Traceback (most recent call last):
## File "<stdin>", line 1, in <module>
##TypeError: join() takes exactly one argument (0 given)
##>>> "".join ([])
##''
##>>> "".join ([1,2])
##Traceback (most recent call last):
## File "<stdin>", line 1, in <module>
##TypeError: sequence item 0: expected string, int found
2015-01-26 23:06:46 +01:00
question(2)
2015-01-27 11:03:08 +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-26 23:06:46 +01:00
question(3)
2015-01-27 11:03:08 +01:00
# TODO utf-8
# TODO en print
##>>> chaine = '!'
##>>> chaine.join(l)
##'la!m\xc3\xa9thode!split!est!parfois!bien!utile'
##>>> chaine
##'!'
print('De par cet exemple, on remarque que chaine reste la même chaîne de caractère, `join` ne modifie donc pas la chaîne de caractère à laquelle elle s\'applique (ce qui est logique vu le caractère non-mutable des chaînes de caractère')
2015-01-26 23:06:46 +01:00
question(4)
2015-01-27 11:03:08 +01:00
def join(chaine, sequence):
# TODO Docstring
2015-01-27 11:03:08 +01:00
res = ''
l = len(sequence)
for i in range(l):
res += sequence[i]
if i < l-1:
res += chaine
return res
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)
2015-01-27 11:17:24 +01:00
# TODO utf-8
# TODO en print
2015-01-27 11:02:24 +01:00
2015-01-27 11:17:24 +01:00
##>>> l = list ('timoleon')
##>>> l.sort()
##>>> l
##['e', 'i', 'l', 'm', 'n', 'o', 'o', 't']
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-01-27 11:17:24 +01:00
##>>> s = "Je n'ai jamais joué de flûte."
##>>> l = list (s)
##>>> l.sort()
##>>> l
##[' ', ' ', ' ', ' ', ' ', "'", '.', 'J', 'a', 'a', 'a', 'd', 'e', 'e', 'e', 'f', 'i', 'i', 'j', 'j', 'l', 'm', 'n', 'o', 's', 't', 'u', '\xa9', '\xbb', '\xc3', '\xc3']
2015-01-27 11:02:24 +01:00
2015-01-27 11:17:24 +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-01-27 11:17:24 +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)
2015-01-27 11:17:24 +01:00
# TODO en print
2015-01-27 11:02:24 +01:00
2015-01-27 11:17:24 +01:00
##>>> l = ['a', 1]
##>>> l.sort()
##>>> l
##[1, 'a']
2015-01-27 11:02:24 +01:00
2015-01-27 11:17:24 +01:00
print('On remarque que 1 se place avant \'a\'. Si nous étions correct dans la question précédente, les éléments de liste sont triés selon leur valeur, ou leur numéro de code pour les caractères. \'a\' ayant pour numéro de code 97 (`ord(\'a\') == 97`), et 1 < 97, il est normal qu\'il se retrouve après le 1.')
2015-01-26 23:06:46 +01:00
section('Une fonction sort pour les chaînes')
question(1)
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-01-27 10:32:05 +01:00
partie('Anagrammes') # Jean-loup
2015-01-26 23:06:46 +01:00
question(1)
2015-01-27 11:35:54 +01:00
def sont_anagrammes3(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
"""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
"""
assert(type(chaine1)==str and type(chaine2)==str)
if len(chaine1) != len(chaine2): # Si la longueur est différente ca ne peut pas être des anagrammes
return False
l1 = list(chaine1)
l2 = list(chaine2)
l1.sort()
l2.sort()
return l1 == l2
2015-01-26 23:06:46 +01:00
question(2)
2015-01-27 11:35:54 +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
"""
assert(type(chaine1)==str and type(chaine2)==str)
if len(chaine1) != len(chaine2): # Si la longueur est différente ca ne peut pas être des anagrammes
return False
occu1 = dict((i,chaine1.count(i)) for i in chaine1)
occu2 = dict((i,chaine2.count(i)) for i in chaine2)
return occu1 == occu2
2015-01-26 23:06:46 +01:00
question(3)
2015-01-27 11:35:54 +01:00
def sont_anagrammes2(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
"""
assert(type(chaine1)==str and type(chaine2)==str)
if len(chaine1) != len(chaine2): # Si la longueur est différente ca ne peut pas être des anagrammes
return False
2015-01-27 11:35:54 +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)
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
"""
assert(type(chaine)==str)
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)
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
"""
assert(type(chaine1)==str and type(chaine2)==str)
if len(chaine1) != len(chaine2): # Si la longueur est différente ca ne peut pas être des anagrammes
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-01-27 10:32:05 +01:00
partie('Recherche d\'anagrammes') # Jean-loup
2015-01-26 23:06:46 +01:00
section('Le lexique')
question(1)
question(2)
question(3)
question(4)
section('Anagrammes dun mot : première méthode')
question(1)
question(2)
section('Anagrammes dun mot : seconde méthode')
question(1)
question(2)
question(3)
question(4)
question(5)
section('Comparaison des deux méthodes')
question(1)
2015-01-27 10:32:05 +01:00
partie('Phrases d\'anagrammes') # Geoffrey
2015-01-26 23:06:46 +01:00
question(1)