Un truc de mentaliste, que l’on peut expliquer à l’aide de Python: voici une vidéo qui circule sur les réseaux sociaux.
Me concernant, cela a fonctionné et d’après les témoignages, c’est le cas de beaucoup de personnes… Étonnant ? Nous allons voir cela…
Truc de mentaliste que l’on peut expliquer à l’aide de Python – Première étape : le prénom féminin
Sir la page https://www.data.gouv.fr/fr/datasets/liste-de-prenoms/, nous pouvons télécharger le fichier CSV des prénoms. Il y a beaucoup de nationalités et nous allons trier cela. Nous allons sélectionner ceux qui sont de nationalité “french” et féminins.
first_line = True filles = dict() with open("Prenoms.csv" , "r") as fic: for line in fic: if first_line == True: first_line = False else: L = line.split(';') if L[1] == 'f' and 'french' in L[2]: filles[ L[0] ] = float(L[3].replace('\n','')) d = sorted(filles.items() , key = lambda c: c[1] , , reverse = True) for i in d: print('{} : {}' . format(i[0],i[1]))
On arrive à la liste suivante:
marie : 122.52 blanche : 103.25 rose : 67.06 victoire : 63.4 claire : 49.67 anne : 45.59 louise : 45.05 marine : 40.49 reine : 36.8 virginie : 35.71 vienne : 30.61 solange : 28.96 avril : 28.83 jolie : 28.77 marguerite : 28.29 suzanne : 27.14 paule : 25.87 adèle : 25.33 catherine : 24.66 thérèse : 23.26 nadine : 21.19 françoise : 20.13 hélène : 20.13 agathe : 20.01 lucie : 18.8 gabrielle : 17.87 sylvie : 17.33 julie : 16.53 madeleine : 16.28 juliette : 16.25 charlotte : 16.22 lucile : 15.96 adélaïde : 15.48 inès : 15.36 geneviève : 15.23 jeanne : 15.13 aimée : 14.85 josette : 14.72 marthe : 14.4 romaine : 12.97 céleste : 12.49 yvonne : 12.3 nicole : 12.17 véronique : 11.82 aurore : 11.02 nathalie : 10.42 alice : 10.07 antoinette : 9.37 sarah : 9.02 diane : 8.82 sophie : 8.47 violette : 8.25 rosette : 8.09 clarisse : 7.93 béatrice : 7.9 isabelle : 7.68 lucienne : 7.07 constance : 6.85 michèle : 6.82 christine : 6.75 berthe : 6.69 lucille : 6.63 aude : 6.31 rachel : 6.31 laure : 6.02 carole : 5.93 monique : 5.93 frédérique : 5.8 alexandrie : 5.54 cécile : 5.51 gilberte : 5.48 francine : 5.42 brigitte : 5.38 germaine : 5.32 aurélie : 4.91 jeannette : 4.91 élodie : 4.84 sabine : 4.84 chantal : 4.71 mathilde : 4.71 mignon : 4.71 chanté : 4.68 joséphine : 4.59 odette : 4.59 giselle : 4.43 caroline : 4.36 marceline : 4.36 renée : 4.33 claudine : 4.17 eugénie : 4.11 albertine : 4.08 mariette : 4.08 agnès : 3.95 pauline : 3.95 colette : 3.79 ambre : 3.76 esther : 3.73 fifi : 3.66 odile : 3.6 micheline : 3.5 barbara : 3.41 mélanie : 3.38 placide : 3.38 gisèle : 3.09 céline : 3.03 mireille : 3.03 julienne : 2.96 jacqueline : 2.9 delphine : 2.84 rochelle : 2.8 désirée : 2.77 clémence : 2.68 judith : 2.68 manon : 2.68 martine : 2.68 valérie : 2.61 ariane : 2.45 cerise : 2.45 flavie : 2.45 hortense : 2.39 denise : 2.36 élise : 2.36 paulette : 2.29 hermine : 2.23 yvette : 2.2 fabienne : 2.07 adrienne : 2.01 héloïse : 2.01 luce : 1.88 sylviane : 1.88 georgette : 1.75 jeanine : 1.72 danièle : 1.62 irène : 1.62 amélie : 1.59 édith : 1.59 olympe : 1.56 bénédicte : 1.53 roxane : 1.53 stéphanie : 1.53 henriette : 1.5 vivienne : 1.47 annette : 1.37 salomé : 1.37 fernande : 1.31 isabel : 1.31 marcelle : 1.31 adeline : 1.27 emma : 1.21 zoé : 1.18 bernadette : 1.15 raymonde : 1.15 léonie : 1.02 liane : 1.02 corinne : 0.99 pénélope : 0.99 christiane : 0.96 esmée : 0.96 margot : 0.92 myriam : 0.92 rolande : 0.89 danielle : 0.86 hyacinthe : 0.86 rosalie : 0.86 lisette : 0.83 andrée : 0.8 angèle : 0.8 arlette : 0.8 michelle : 0.8 amarante : 0.76 justine : 0.76 natalie : 0.76 muriel : 0.73 émilie : 0.7 léontine : 0.7 sibylle : 0.7 arnaude : 0.67 aline : 0.61 rosine : 0.61 dorothée : 0.57 perrine : 0.57 elisabeth : 0.54 ninon : 0.51 éliane : 0.48 océane : 0.48 yolande : 0.48 yseult : 0.48 pascale : 0.41 sandrine : 0.41 célestine : 0.38 honorine : 0.38 irénée : 0.38 lydie : 0.38 mirabelle : 0.38 sidonie : 0.38 félicie : 0.35 régine : 0.35 jacinthe : 0.29 morgane : 0.29 suzette : 0.29 toinette : 0.25 anastasie : 0.22 apolline : 0.22 chloé : 0.22 eve : 0.22 josiane : 0.22 nicolette : 0.22 edwige : 0.19 eulalie : 0.19 ghislaine : 0.19 pascaline : 0.19 carine : 0.16 josèphe : 0.16 ninette : 0.16 rébecca : 0.16 benjamine : 0.13 jeannine : 0.13 marielle : 0.13 noémie : 0.13 oriane : 0.13 rosemonde : 0.13 alphonsine : 0.1 cosette : 0.1 fabiola : 0.1 gigi : 0.1 hannah : 0.1 léa : 0.1 philippine : 0.1 emmanuelle : 0.06 laurette : 0.06 victorine : 0.06 anaïs : 0.03 angeline : 0.03 angelique : 0.03 claudette : 0.03 donatienne : 0.03 doriane : 0.03 eléonore : 0.03 faustine : 0.03 josée : 0.03 marcelline : 0.03 marise : 0.03 ouida : 0.03 sébastienne : 0.03 arianne : 0.0 arienne : 0.0 armelle : 0.0 axelle : 0.0 benoite : 0.0 bernardine : 0.0 charline : 0.0 christelle : 0.0 christianne : 0.0 clarice : 0.0 clementine : 0.0 clothilde : 0.0 cunégonde : 0.0 dianne : 0.0 dieudonnée : 0.0 éloise : 0.0 emeline : 0.0 evette : 0.0 felicienne : 0.0 florette : 0.0 florianne : 0.0 gaetane : 0.0 georgine : 0.0 gervaise (2) : 0.0 gisselle : 0.0 gwenaelle : 0.0 joceline : 0.0 joelle : 0.0 juliane : 0.0 laurence (2) : 0.0 laurentine : 0.0 léonne : 0.0 lucinde : 0.0 lucrece : 0.0 lunete : 0.0 madeline : 0.0 marcellette : 0.0 marianne (1) : 0.0 maximilienne : 0.0 mélissa : 0.0 morgaine : 0.0 nadia (1) : 0.0 nina (1) : 0.0 noella : 0.0 noelle : 0.0 olivie : 0.0 orianne : 0.0 roselle : 0.0 roxanne : 0.0 seraphine : 0.0 sévérine : 0.0 simone (1) : 0.0 sybille : 0.0 sylvaine : 0.0 sylvianne : 0.0 tatienne : 0.0 valentine (2) : 0.0 zephyrine : 0.0
Il y a beaucoup de prénoms qui finissent pas “e”:
first_line = True filles = dict() with open("Prenoms.csv" , "r") as fic: for line in fic: if first_line == True: first_line = False nb , nb_e = 0 , 0 else: L = line.split(';') if L[1] == 'f' and 'french' in L[2]: if '(' in L[0]: L[0] = L[0].replace(' (1)','').replace(' (2)','') filles[ L[0] ] = float(L[3].replace('\n','')) nb += 1 if L[0][-1] == 'e': nb_e += 1 print(nb_e/nb)
0.8807947019867549
88% pour être exact. Mais pour être complet, regardons toutes les lettres finales des prénoms:
first_line = True lettres_finales = dict() with open("Prenoms.csv" , "r") as fic: for line in fic: if first_line == True: first_line = False else: L = line.split(';') if L[1] == 'f' and 'french' in L[2]: if '(' in L[0]: L[0] = L[0].replace(' (1)','').replace(' (2)','') if L[0][-1] in lettres_finales: lettres_finales[ L[0][-1] ] += 1 else: lettres_finales[ L[0][-1] ] = 1 T = sorted(lettres_finales.items() , key = lambda c: c[1] , reverse = True) for i in T: print('{} : {}' . format(i[0],i[1]))
e : 266 a : 10 l : 5 h : 5 é : 4 s : 3 n : 3 i : 2 t : 2 r : 1 m : 1
Truc de mentaliste que l’on peut expliquer à l’aide de Python – Deuxième étape : le pays
Vous l’avez sans doute deviné, il ne reste pas beaucoup de choix pour le pays car seuls 11 initiales sont possibles.
J’ai téléchargé la liste des pays du monde sur la page https://sql.sh/514-liste-pays-csv-xml. Ce fichier est composé de plusieurs lignes à 6 champs : seul le 5ème nous intéresse (le nom français des pays). Je vais donc construire une liste des pays dont l’initiale se trouve parmis celles retenues précédemment:
pays = list() initiales = [ 'e' , 'a' , 'l' , 'h' , 'é' , 's' , 'n' , 'i' , 't' , 'r' , 'm' ] with open ('sql-pays.csv' , 'r' , encoding = 'utf8') as fic: for ligne in fic: L = ligne.split(',') if L[4][1].lower() in initiales: pays += [ L[4].replace('"','') ] for i in pays: print(i)
Afghanistan Albanie Antarctique Algérie Samoa Américaines Andorre Angola Antigua-et-Barbuda Azerbaïdjan Argentine Australie Autriche Arménie Territoire Britannique de l'Océan Indien Myanmar République Centrafricaine Sri Lanka Tchad Taïwan Mayotte République du Congo République Démocratique du Congo République Tchèque République Dominicaine Équateur El Salvador Éthiopie Érythrée Estonie Terres Australes Françaises Territoire Palestinien Occupé Allemagne Haïti Saint-Siège (état de la Cité du Vatican) Honduras Hong-Kong Hongrie Islande Inde Indonésie République Islamique d'Iran Iraq Irlande Israël Italie République Populaire Démocratique de Corée République de Corée République Démocratique Populaire Lao Liban Lesotho Lettonie Libéria Liechtenstein Lituanie Luxembourg Macao Madagascar Malawi Malaisie Maldives Mali Malte Martinique Mauritanie Maurice Mexique Monaco Mongolie République de Moldova Montserrat Maroc Mozambique Namibie Nauru Népal Antilles Néerlandaises Aruba Nouvelle-Calédonie Nouvelle-Zélande Nicaragua Niger Nigéria Niué Norvège États Fédérés de Micronésie Timor-Leste Réunion Roumanie Rwanda Sainte-Hélène Saint-Kitts-et-Nevis Anguilla Sainte-Lucie Saint-Pierre-et-Miquelon Saint-Vincent-et-les Grenadines Saint-Marin Sao Tomé-et-Principe Arabie Saoudite Sénégal Seychelles Sierra Leone Singapour Slovaquie Slovénie Somalie Afrique du Sud Espagne Sahara Occidental Soudan Suriname Svalbard etÎle Jan Mayen Swaziland Suède Suisse République Arabe Syrienne Tadjikistan Thaïlande Togo Tokelau Tonga Trinité-et-Tobago Émirats Arabes Unis Tunisie Turquie Turkménistan Tuvalu L'ex-République Yougoslave de Macédoine Égypte Royaume-Uni République-Unie de Tanzanie États-Unis Samoa Serbie-et-Monténégro
Là encore, regardons les dernières lettres possibles:
pays = list() initiales = [ 'e' , 'a' , 'l' , 'h' , 'é' , 's' , 'n' , 'i' , 't' , 'r' , 'm' ] with open ('sql-pays.csv' , 'r' , encoding = 'utf8') as fic: for ligne in fic: L = ligne.split(',') if L[4][1].lower() in initiales: pays += [ L[4].replace('"','') ] lettres_finales = dict() nbtotal , nb_e = 0 , 0 for i in pays: nbtotal += 1 if i[-1] == ')': lettres_finales[ 'e' ] += 1 nb_e += 1 else: if i[-1] in lettres_finales: lettres_finales[ i[-1] ] += 1 else: lettres_finales[ i[-1] ] = 1 if i[-1] == 'e': nb_e +=1 T = sorted(lettres_finales.items() , key = lambda c: c[1] , reverse = True) for i in T: print('{} : {}' . format(i[0],i[1])) print('{} % de "e"'.format( round(nb_e*100/nbtotal,2) ))
e : 61 n : 14 a : 12 s : 10 o : 9 r : 6 i : 4 l : 4 d : 3 u : 3 é : 2 g : 2 q : 1 t : 1 c : 1 45.86 % de "e"
Là encore, il y a une majorité de “e”.
À ce stade, la probabilité d’arriver à un “e” ou un “é” est assez importante (j’avoue que j’ai eu la flemme de la calculer mais c’est un simple arbre de probabilités conditionnelles au final! C’est juste qu’il comporte au maximum 1463 branches et, comme disait Pierre Fermat : “je n’ai pas la place”).
Sur ces statistiques, on peut être presque assurés que le “e” est obtenu à cette étape, tout en ayant en tête que le “n”, le “a” et le “s” le talonnent.
Truc de mentaliste que l’on peut expliquer à l’aide de Python – Troisième étape : l’animal
Je n’ai pas pu obtenir de liste d’animaux exhaustive. Alors, je me suis appuyé sur mes connaissances personnelles (très limitées).
EUn animal dont le nom commence par un “e”… à part l’éléphant, il n’y a rien qui me vient à l’esprit immédiatement. Si j’étais un sibérien, j’aurais peut-être pensé à l’élan… (en Amérique du Nord, on appelle cela un orignal donc je n’en parle pas). J’aurais pu penser à un escargot ou un écureuil… mais je ne sais pour quelles raisons obscures, les gens n’y pensent pas immédiatement. Bon, pour l’escargot, je peux comprendre car on peut ne pas le percevoir comme un animal mais comme un délicieux met, mais l’écureuil… Quoi que ! Il est vrai qu’en France, les écureuils sont discrets (contrairement aux éléphants!). À vrai dire, après quelques recherches, il y en a peu:
- éléphant
- élan
- esturgeon
- écureuil
- écrevisse
- étourneau
- églefin
- étoile de mer
Vous ne remarquez rien ? Dans l’inconscient des gens, il est fort à parier que seul l’éléphant est perçu comme un animal (car animal est associé à mammifère…).
NLes animaux qui commencent par “n”… Là, comme ça, rien ne m’est venu! Pourtant, il y en a. Ce ne sont pas des animaux qui sautent à l’esprit quand-même! Il a fallu que je cherche sur l’Internet…
- NAJA: Serpent à lunettes.
- NANDINIE: Mammifère carnivore d’Afrique tropicale.
- NANDOU: Oiseau coureur.
- NARVAL : (Narvals) Cétacé arctique.
- NASIQUE : Singe à nez long et mou, c’est aussi une couleuvre de l’Inde.
- NATICE : Mollusque des plages de l’Europe occidentale.
- NAUTILE : Mollusque des mers chaudes.
- NDAMA : Race bovine d’Afrique. Ne pas oublier de pastiller devant DAMA.
- NEMERTE : Ver plat marin.
- NEREIDE : Ver marin vivant dans la vase.
- NEREIS : Pareil que NEREIDE.
- NERITE : Mollusque gastéropode.
- NILGAUT : Antilope d’Asie à courtes cornes.
- NOCTULE : Chauve-souris.
- NOVILLO : Jeune taureau.
- NUDIBRANCHE : Allez de temps en temps un mot très long, mollusque gastropode marin.
- NYCTALE : Petit rapace nocture, chouette boréale.
Source : http://legardemots.canalblog.com/archives/2011/06/13/21387634.html
On est d’accord ? Il n’y en a pas un qui saute à l’esprit immédiatement hein?
AQuant aux animaux dont l’initiale est le “a”, c’est peut-être plus simple. Il y a bien sûr l’âne, l’abeille, l’araignée, l’anaconda… Donc concernant cette lettre, ce n’est pas très difficile.
Dernière étape : la fleur
Bon, là, à ce stade, “éléphant” est presque assuré d’être en tête… On cherche donc une fleur dont l’initiale est un “t”. La première fleur qui vient à l’esprit est bien entendu “tulipe”, même si le tournesol est une fleur (mais ça, ce n’est pas immédiat), de même que le trèfle (pas très connu pour être une fleur mais si!) et le tussilage (ouais, ça existe!). Et c’est tout ! Autant dire que “tulipe” est sans doute la seule chose qui vient à l’esprit…
Bilan
Ce genre de “tour” s’appuie sur des statistiques comme celles que nous venons de voir, mais aussi sur les présumées connaissances du public, que l’on estime en général très limitées.
Si cette vidéo est vu par des millions de gens, il est fort à parier que cela ne fonctionnera pas toujours car il y a tout de même des gens cultivés (plus que moi!). Mais en général, elle produit l’effet escompté.