2010-08-19 8 views
1

J'ai une liste de mots possibles pour faire une anagramme des mots donnés. Chaque chaîne de liste est la clé du dictionnaire et a la valeur d'un ou plusieurs mots. Quelle est la meilleure façon (plus rapide, pythonique) de faire toutes les phrases possibles dans l'ordre des clés à partir des mots de chaque liste des touches correspondantes du dictionnaire. Les listes contiennent un nombre variable de clés.Trouver toutes les phrases de la liste de mots-clés à dict

keylist = ['key1', 'key2', 'key3'] 
worddict = {'key1': ['a','b','c'], 'key2':['d','e','f'], 'key3':['g','h','i']} 

Résultat attendu (premier mot de la première liste des clés, deuxième de la deuxième liste des clés et ainsi de suite):

["a d g", 
"a d h", 
"a d i", 
..... 
"c f i"] 

Répondre

0

Encouragés à singe avec les produits que je pouvais les plier pour adapter nombre variable de clés de dictionnaire des listes comme ceci:

import itertools 
keylist = ['key1', 'key4','key2'] 
worddict = {'key1': ['a','b','c'], 
      'key2':['d','e','f'], 
      'key3':['g','h','i'], 
      'key4':['j','k','l']} 
sentences = (' '.join(sentence) 
      for sentence in itertools.product(*(worddict[k] 
               for k in keylist))) 
print '\n'.join(sentences) 
1

Est-ce que quelque chose comme ce travail?

import itertools 
anagrams = [] 
for x in itertools.product(*worddict.values()): 
    anagrams.extend(" ".join(y) for y in itertools.permutations(x)) 
+0

keylist manque de solution. La liste de mots contient plus de 10000 mots, mais le formulaire d'anagramme correct n'a que quelques mots. La constatation d'anagramme que j'ai optimisée complètement, en utilisant des permutations est inappropriée. Je veux seulement l'ordre de keylist et seulement les clefs qui sont dans la liste (1 à 6 mots typiquement). –

6

Utilisez la fonction product dans le module itertools pour produire toutes les combinaisons de vos iterables

import itertools 

for sentence in itertools.product(['a','b','c'], ['d','e','f'], ['g','h','i']): 
    print sentence 

La sortie sera tuples, mais ceux-ci peuvent facilement être converties en chaînes ou des listes, si nécessaire.