Est-il possible de m'indiquer s'il est possible d'effectuer avec un logiciel de programmation une extraction de lettres dans 2 mots différents ?
Par exemple avec les mots PAPA et MAMAN, je voudrais avoir toutes les possibilités (pas obligatoirement dans un dictionnaire) et quelle que soit la disposition des 2 mots.
= PM PA PN MP MA AM AA AN AP NP NA
Pour mon projet, je pense me limiter à 10 mots au maximum. Si vous voyez une limite dans le nombre de mots, je m'arrangerai pour modifier mon projet de l'ordre de vos conseils.
Bien que je ne sois pas certain de comprendre exactement ce que tu veux faire, je peux dire que c'est possible. Mais connais-tu un langage de programmation?Je suis presque certain que je pourrais le faire en Python. Pour le nombre de mots, ça peut être très grand. J'ai un dictionnaire qui contient environ 325 000 mots et je peux le gérer facilement.
Le Tout est souvent plus grand que la somme de ses parties.
Ce que tu souhaites faire s'appelle une permutation.
Il existe un module Python qui a une fonction destinée à cela. C'est le module itertools. Et la fonction est permutations()
Pour avoir ton résultat on fait : permutations("PAPAMAMAN", 2).
Pour le lien, je te conseille de descendre un peu pour voir les exemples. Puis de cliquer sur le lien "permutations" car on voit comment est créée la fonction.
J'ai pensé à ça, mais je me pose une question, doit-on prendre une lettre dans chaque mot ou si on mélange tout? Est-ce seulement des combinaisons (ou permutations) de 2 lettres ou plus de lettres? Si j'ai 10 mots ou plus, il y a risque de redondances. La fonction permutations en tient-elle compte?
from itertools import permutations print(*sorted(set(''.join(p) for p in permutations("papamaman", 2)))))
aa am an ap ma mm mn mp na nm np pa pm pn pp
-
Si on veut toutes les permutations de 2 lettres, on peut avoir au maximum 676 possibilités. Alors, amusons-nous un peu. Si je veux prendre deux noms dans l'ordre:
from itertools import combinations famille = ["papa", "maman", "soeur", "frere"] print(*list(combinations(famille, 2)))
sequence = lambda V: (seq:=lambda L, n: [""] if n==0 else [i+s for i in L[-n] for s in seq(L, n-1)])(V, len(V)) L=["abc", "df", "ghi"] print(*sequence(L))
Oui c'est possible assez facilement je dirais, avec n'importe quel langage de programmation.
En gros l'algorithme serait de :
boucler sur les lettres du 1er mot
dans cette boucle créer une seconde boucle qui bouclerait sur le deuxième mot
et ensuite ajouter les lettres courante de la 1ère boucle avec la lettre courante de la 2ème boucle dans un tableau
Peut-être que tu ne veux pas de doublons, dans ce cas soit tu dédoublonnes à la fin, soit avant de rajouter une nouvelle combinaison à ton tableau tu vérifie qu'elle n'est pas déjà présente.
Ce que tu souhaites faire s'appelle une permutation.
Il existe un module Python qui a une fonction destinée à cela. C'est le module itertools. Et la fonction est permutations()
Pour avoir ton résultat on fait : permutations("PAPAMAMAN", 2).
Pour le lien, je te conseille de descendre un peu pour voir les exemples. Puis de cliquer sur le lien "permutations" car on voit comment est créée la fonction.
Merci pour le module, je vais regarder comment l'utiliser. Je n'ai jamais utilisé un outil de programmation mais ce sera l'occasion.
PierrotLeFou a écrit:
J'ai pensé à ça, mais je me pose une question, doit-on prendre une lettre dans chaque mot ou si on mélange tout? Est-ce seulement des combinaisons (ou permutations) de 2 lettres ou plus de lettres? Si j'ai 10 mots ou plus, il y a risque de redondances. La fonction permutations en tient-elle compte?
from itertools import permutations print(*sorted(set(''.join(p) for p in permutations("papamaman", 2)))))
aa am an ap ma mm mn mp na nm np pa pm pn pp
-
Si on veut toutes les permutations de 2 lettres, on peut avoir au maximum 676 possibilités. Alors, amusons-nous un peu. Si je veux prendre deux noms dans l'ordre:
from itertools import combinations famille = ["papa", "maman", "soeur", "frere"] print(*list(combinations(famille, 2)))
sequence = lambda V: (seq:=lambda L, n: [""] if n==0 else [i+s for i in L[-n] for s in seq(L, n-1)])(V, len(V)) L=["abc", "df", "ghi"] print(*sequence(L))
Merci pour les différentes possibilités. Dans mon projet, je prends une lettre dans chaque mot. En reprenant PAPA et MAMAN, une des solutions est PA, le P étant la lettre venant de PAPA et le A venant de MAMAN (le A ne peut pas venir de PAPA) mais PP n'est pas une des solutions car les deux P sont dans le mot PAPA.
Sauf que tu as 2 'a' dans papa et 2 'a' dans maman, tu auras donc des 'aa', non? Si je reprend ma fonction sequence avec seulement les mots "papa" et "maman":
sequence = lambda V: (seq:=lambda L, n: [""] if n==0 else [i+s for i in L[-n] for s in seq(L, n-1)])(V, len(V)) L=["papa", "maman"] print(*sequence(L))
pm pa pm pa pn am aa am aa an pm pa pm pa pn am aa am aa an
Je pourrais générer les permutations inverses comme 'pm' -> 'mp'
>>> L = ['pm', 'ap'] >>> L ['pm', 'ap'] >>> L = L + [j+i for i,j in L] >>> L ['pm', 'ap', 'mp', 'pa'] Puis ne garder qu'une copie avec set et trier avec sorted.
P.S. Ma fonction sequence ne marche qu'avec les versions Python 8 ou ultérieures
Je suis sur Python 10.4.
- Edité par PierrotLeFou 22 juin 2022 à 19:24:05
Le Tout est souvent plus grand que la somme de ses parties.
extraction lettres
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.