import pprint
from collections import defaultdict
# Ceci est une meilleure approximation de ce que Bryan essaie de faire.
# Cependant, les résultats sont sans signification car la liste est modifiée
# pendant l'itération dessus. Donc je n'ai pas montré la sortie.
def extract_by_letters_0(letters, input_list):
dictionary = input_list.copy()
for word in dictionary:
for letter in letters:
if word.count(letter) != letters.count(letter):
if word in dictionary: #Je ne peux pas laisser cette ligne dehors
dictionary.remove(word)
return dictionary
# Cela évite la mutation.
# Les résultats sont des anagrammes PLUS des lettres qui n'apparaissent pas
# dans la requête. Par exemple, "same" produit "samehood" mais pas "sameness"
# ("sameness" a 3*"s" et 2*"e" au lieu de 1 de chaque)
def extract_by_letters_1(letters, input_list):
dictionary = set(input_list)
ripouts = set()
for word in dictionary:
for letter in letters:
if word.count(letter) != letters.count(letter):
ripouts.add(word)
return dictionary - ripouts
def anagram_key(strg):
return ''.join(sorted(list(strg)))
def check_anagrams(str1, str2):
return sorted(list(str1)) == sorted(list(str2))
# Conseil: essayez des algorithmes comme celui-ci sur un PETIT ensemble de données d'abord.
# Faites-le fonctionner correctement. Utilisez différentes cas de test. Ayez un code de test
# aussi primitif soit-il pour vérifier vos résultats.
# Ensuite, si cela fonctionne lentement, les aides
# ne doivent pas deviner ce que vous faites.
raw_text = """
twas brillig and the slithy toves
did gyre and gimble in the wabe
same mesa seam sameness samehood
"""
lexicon = sorted(set(raw_text.split()))
print "\nlexicon:", lexicon
#
# En supposant que nous voulons des anagrammes:
#
# Construire un dictionnaire d'anagrammes
#
anagram_dict = defaultdict(set)
for word in lexicon:
anagram_dict[anagram_key(word)].add(word)
print "\nanagram_dict (len == %d):" % len(anagram_dict)
pprint.pprint(anagram_dict)
# maintenant purger les entrées triviales
temp = {}
for k, v in anagram_dict.iteritems():
if len(v) != 1:
temp[k] = v
anagram_dict = temp
print "\nanagram_dict (len == %d):" % len(anagram_dict)
pprint.pprint(anagram_dict)
# Cas de test
tests = "sam same mesa sameness samehood xsame samex".split()
default_set = frozenset()
for test in tests:
print
results = extract_by_letters_1(test, lexicon)
print test, [(result, check_anagrams(test, result)) for result in results]
# Dans l'instruction suivante, vous pouvez utiliser set([test]) comme valeur par défaut
# si cela produit un résultat plus utile ou orthogonal.
results = anagram_dict.get(anagram_key(test), default_set)
print test, [(result, check_anagrams(test, result)) for result in results]
Output:
lexicon: ['and', 'brillig', 'did', 'gimble', 'gyre', 'in', 'mesa', 'same', 'samehood', 'sameness', 'seam', 'slithy', 'the', 'toves', 'twas', 'wabe']
anagram_dict (len == 14):
defaultdict(, {'abew': set(['wabe']), 'eht': set(['the']), 'egry': set(['gyre']), 'begilm': set(['gimble']), 'hilsty': set(['slithy']), 'aems': set(['mesa', 'seam', 'same']), 'bgiillr': set(['brillig']), 'ddi': set(['did']), 'eostv': set(['toves']), 'adehmoos': set(['samehood']), 'in': set(['in']), 'adn': set(['and']), 'aeemnsss': set(['sameness']), 'astw': set(['twas'])})
anagram_dict (len == 1):
{'aems': set(['mesa', 'same', 'seam'])}
sam [('mesa', False), ('samehood', False), ('seam', False), ('same', False)]
sam []
same [('mesa', True), ('samehood', False), ('seam', True), ('same', True)]
same [('mesa', True), ('seam', True), ('same', True)]
mesa [('mesa', True), ('samehood', False), ('seam', True), ('same', True)]
mesa [('mesa', True), ('seam', True), ('same', True)]
sameness [('sameness', True)]
sameness []
samehood [('samehood', True)]
samehood []
xsame []
xsame []
samex []
samex []