Python ne veut pas mapper — Les-mathematiques.net The most powerful custom community solution in the world

Python ne veut pas mapper

Bonjour,

je cherche à regarder comment fonctionne Python et j'ai un souci avec la fonction map. J'ai tapé dans l'interpréteur la fonction suivante (pour que f soit la fonction 2x) :

def f(x):
return(x*2)

Puis,toujours dans l'interpréteur :
map(f,[1,2,3,4])

Il me renvoie <map object at 0x0376B0D0>. Comme Google ne renvoie aucune occurence, je suis embêté... J'ai tenté de faire la même chose dans l'éditeur (IDLE chez moi) puis de lancer et ça me donne le même résultat.

Petite précision : dans l'interpréteur, le titre de la fenêtre est Python 3.4.2 Shell, au cas où le numéro de version ait une importance.
«13

Réponses

  • Cela marchait en python 2...
    Maintenant il faut faire :46487
  • Python 3 a changé le type de retour de la fonction map par rapport à Python 2, mais tu peux récupérer une liste en composant :
    list(map(f,[1,2,3,4]))
    

    En fait, il est plus idiomatique d'écrire
    [f(x) for x in [1,2,3,4]]
    
  • Bonjour,
    La fonction map (comme beaucoup d'autres fonctions) retourne un itérateur dans Python 3, ce qui a son utilité.
    L'utilisation des listes en compréhension recommandée par Siméon est beaucoup plus adaptée dans le cas d'une fonction aussi simple que $x\mapsto 2x$.
    On peut encore plus simplement écrire :
    [2*x for x in range(1, 5)]
    
    Évidemment, s'il s'agit d'appliquer ça à tout un tas de fonctions et dans un cours avec des élèves, map semble fort sympathique. Dans ce cas, il faudrait mieux utiliser Python 2 pour que cela soit plus simple.
  • Merci pour vos réponses, cela marche maintenant sans problème. Mon exemple est effectivement parfaitement idiot mais c'est pour tester, rien de plus.
  • Bonjour,

    j'ai une nouvelle question sur Python (ça n'a pas à voir avec ma première question, je ne sais pas s'il est préférable d'ouvrir un autre sujet ?)

    Je veux faire une fonction qui me renvoie les deux plus grands termes d'une liste (pour le moment, je me fiche qu'ils soient distincts ou pas, j'améliorerai ensuite)
    J'ai une fonction qui me renvoie le maximum d'une liste (idem, elle ne renvoie que la première occurence du maximum) :

    def maximum(tableau):
    maxi=tableau[0]
    for i in range(len(tableau)):
    if tableau>maxi:
    maxi=tableau
    return(maxi)

    Je suppose qu'il existe une fonction max dans Python, mais j'essaie de m'entraîner pour le moment.

    Ensuite, mon idée est de faire une fonction deux_max, qui renvoie le plus grand max avec ma fonction maximum, puis qui enlève ce max dans ma liste et me renvoie le second plus grand max, toujours avec ma fonction maximum :

    def deux_max(tableau):
    max_1=maximum(tableau)
    return(max_1,maximum(tableau.remove(max_1)))

    Le problème, c'est que que mon tableau.remove(max_1) renvoie None, ce qui fait bugger ma fonction maximum (je sais qu'elle renvoie None car j'ai testé ça en mettant un print dans ma fonction pour voir ce que ça faisait). Je ne comprends pas le comportement de ce remove puisqu'il fait ce que je veux quand je l'utilise dans l'interpréteur.
  • La méthode remove enlève effectivement un élément mais ne retourne rien.
    Sors le tableau.remove en ajoutant une ligne avant.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Ok merci Nicolas, effectivement ça marche ainsi (après avoir tapé tableau = tableau.remove(max_1) qui ne marche pas non plus pour la même raison).
  • Si tu ne veux pas toucher à ton tableau, utilise les tranches avec l’opérateur crochets et la méthode index (avec un risque si le maximum est présent deux fois).
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Ta solution à base de remove n'est 1) pas efficace 2) peu souhaitable...

    1) pas efficace car pour supprimer la valeur dans le tableau, Python doit parcourir tout le tableau si jamais le max est à la fin ; alors qu'on peut effectuer l'opération que tu souhaites en ne faisant qu'un seul parcourt.

    2) TU MODIFIES TON TABLEAU !!! Et ça, c'est tout à fait inatendu pour une fonction "max"....
    Par exemple en appelant 2 fois de suite ta fonction sur le même tableau, on a :
    t = [1,2,3]
    max_deux(t) #renvoie (3,2)
    max_deux(t) #renvoie (2,1)
    

    La plupart du temps, les fonctions qui renvoient des trucs ne modifient pas leurs arguments (au contraire de .remove qui ne renvoie rien mais modifie le tableau).
  • Pour éviter la modification de tableau passé en argument, je peux créer une variable locale t=tableau et faire des remove sur ce tableau t. Il me semble que cela enlève ton objection 2. En Maple, je faisais souvent ça puisqu'il interdit de modifier une variable passée en argument d'une procédure (après, je n'ai jamais eu à programmer de gros projets avec des appels multiples à plusieurs fonctions).

    Pour l'objection 1, effectivement je peux utiliser ce que Nicolas propose. Je fais une fonction maximum qui me donne aussi la position du premier maximum sous la forme :

    def maximum(tableau):
    maxi=[tableau[0],0]
    for i in range(len(tableau) + 1):
    if tableau>maxi:
    maxi=[tableau,i]
    return(maxi)

    Je lance maximum sur mon tableau, puis je relance maximum sur tableau[0:i-1] + tableau[i + 1:]
  • J'en profite pour poser une question : Python commence ses listes à 0, donc le dernier terme de la liste est d'indice n - 1 (où n est la longueur de la liste). Est-ce qu'il y a une bonne raison à ça ? (par rapport à indexer de 1 à n). Je suis sûr que j'ai déjà été emm.. avec Maple qui indexe de 1 à n sur certains problèmes, mais j'ai l'impression que ce sera la même chose avec Python qui indexe de 0 à n - 1. En gros, est-ce qu'il y a un choix qui minimise les galères ?

    Pour le moment (mais je manque clairement d'expérience là-dessus), je trouve que le choix 0:n-1 complique pour les boucles for : je suppose que le fait que Python n'éxécute pas i = n dans for i in range(1,n) n'est pas étranger à ce choix et je trouve cela très peu pratique. Mais je ne demande qu'à être contredit.
  • Utilise les balises "code" pour avoir un programme lisible ! Là on ne comprend rien !

    Faire un t = tableau ne fait rien en fait, tu copies juste l'adresse. Ce que tu veux faire est un t = tableau.copy(), mais c'est super lourd : tu recopies le contenu de tout le tableau.


    Pour la fonction max que tu proposes, dans le if je pense que tu veux dire tableau > maxi[0], et maxi = [tableau, i].

    Mais cette solution te demande encore de parcourir 2 fois le tableau...

    Mon idée du post précédent était de recoder la fonction max en se souvenant des 2 plus grands éléments rencontrés, tu as donc 2 variables temporaires maxi1 et maxi2.


    _____________________________________________


    Pour ta deuxième question, la seule "vraiment bonne raison" que je trouve est qu'en C, un tableau t est un pointeur (une adresse) qui désigne l'adresse du début du tableau en mémoire. Donc la première case du tableau se trouve à l'adresse t + "0 bloc mémoire", le deuxième bloc à t +"1 bloc mémoire"... Et que donc la conversion est plus rapide en gardant cette convention. Ça reste léger comme "bonne raison" j'en conviens.

    Une autre raison peut-être : le C est très populaire et indexe à partir de 0, pour ne pas trop changer les habitudes des gens, on garde les même conventions (encore très léger, je ne suis pas convaincu moi-même).

    Après c'est un question d'habitude, et certains trucs s'expriment mieux en partant de 0, d'autres de 1.

    Pour le "0:n-1" du range, au contraire c'est super cohérent avec l'indexation des listes, pour parcourir toute une liste, tu peux faire*** :
    for i in range(n):
        print(tableau[i ])
    
    Au passage, c'est la convention dans python, toutes les bornes inférieures sont inclus et les bornes supérieures sont exclues, ça peut permettre de couper le parcours d'un tableau sans s'emmêler avec les +/- 1:
    for i in range(n//2):
         print(tableau[i ])
    
    # on s'occupe de l'autre moitié
    for i in range(n//2, n):
        print(-tableau[i ])
    



    ***Mais un vrai Pythoneux ferait :
    for element in tableau:
        print(element)
    
  • t=list(tableau) marchera aussi bien.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Pour la deuxième question, voir la réponse de Dijkstra himself : http://www.cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF

    Par ailleurs, faites attention aux i entre crochets sur le forum.
  • Effectivement NP, on peut aussi faire, ce qui a la même conséquence que le .copy : on recopie la liste !

    Merci Hébus pour ce lien et pour l'indications des sauvages... Au fait, comment vont tes mouches ?
  • Bonsoir,

    Laisse tomber, Sebsheep, c'est un troll.

    Cordialement,

    Rescassol
  • Merci, désolé pour le programme mal écrit et bourré d'erreurs, j'ai juste voulu bricoler rapidement une amélioration.

    Pour les éléments de réponse sur l'indexation des listes, je pensais qu'il y avait mieux que les raisons que tu cites, même s'il faut bien faire un choix à un moment. Pour les boucles for qui exclut la borne supérieure, je dois dire que je n'y ai pas encore vu d'avantage, mais ça viendra peut-être.
  • Pour pas mal de situation, c'est bien de commencer à numéroter à zéro. Exemple naïf :
    >>>> L = [4,0,2,1]
    >>>> sum(L[k]*10**k for k in range(4))
    1204
    
    Par ailleurs, c'est plutôt agréable que la liste « range(4) » contienne 4 entiers plutôt que 5. Avec ces deux contrainte, il faut se faire à l'idée que range(n) décrive les entiers de $0$ à $n-1$.
  • Bonsoir,

    Je préfère:
    L = [4,0,2,1]
    sum(L[k]*10**(3-k) for k in range(4))
    4021
    

    Cordialement,

    Rescassol
  • Sage met les chiffres dans le sens des puissances croissantes :
    sage: 4201.digits()
    [1, 0, 2, 4]
    

    Cela contrevient à l'habitude d'écriture mais en terme de codage informatique, je trouve en effet plus naturel que si L désigne une liste des chiffres, L[0] soit le coefficient de $10^0$ même s'il est écrit le plus à gauche quand on affiche L.
  • Bonsoir,

    Il n'y a pas, à ma connaissance, cette fonction "digits()" en Python, que j'utilise, mais on peut écrire:
    [int(char) for char in str(4201)]
    [4, 2, 0, 1]
    

    Bon, mais ce n'est qu'un détail.

    Cordialement,

    Rescassol
  • Sinon :
    L=[4,0,2,1]
    "".join(map(str,L))
    
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Effectivement, c'est dans cette situation (écrire des nombres à partir de ses chiffres) que cette liste qui commence à 0 est pratique.

    Je reviens avec mes questions, très terre à terre : je veux utiliser matplotlib et numpy que je n'ai pas initialement. En cherchant un peu, j'ai pu télécharger sur http://www.lfd.uci.edu/~gohlke/pythonlibs/ les deux fichiers suivants :
    numpy-1.9.3+mkl-cp34-none-win_amd64
    matplotlib-1.5.0-cp34-none-win_amd64
    (je suis sous Windows 7 64 bits et j'ai la version 3.4.2 de Python)

    Mais il s'agit de fichiers WHL dont je ne sais que faire. J'ai cru comprendre qu'il fallait les copier dans le sous-dossier Scripts du dossier Python. J'ai trouvé dans ce dossier plusieurs applications pip qui ont apparemment à voir avec l'installation de librairies, mais je suis un peu bloqué.
  • Je ne sais quelle distribution de Python tu utilises, mais je te conseille d'utiliser Pyzo qui inclut (entre autres) les deux bibliothèques dont tu parles, mais également l'environnement IEP et le Python interactif IPython.
  • Merci de ta réponse. Effectivement, avec Pyzo que j'ai installé, tout marche facilement.

    En fait, je pense qu'au début je ne me suis pas cassé la tête : j'ai dû aller sur https://www.python.org/ et télécharger la version la plus récente. Ensuite, j'utilisais Idle pour taper mes procédures. Par contre, je ne sais pas ce que signifie le mot "distribution" : pour moi, j'ai Python 3.4.2 et je pensais que c'était ça.

    J'espère que ce n'est pas gênant qu'il y ait deux distributions Python installées ?
  • Pas du tout.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Bonjour,

    je reviens avec mes questions Python. J'ai un texte (dans un bloc-note) et je veux compter le nombre de "e".
    Je procède comme cela :
    texte = open("fichier_texte.txt",'r')
    mon_texte_en_chaine_de_caractere = texte.read()
    compteur = 0
    for i in mon_texte_en_chaine_de_caractere:
        if i == 'e':
            compteur = compteur + 1
    print("Le texte a",compteur,"e.")
    texte.close()
    

    Après l'avoir ouvert, j'ai mis mon texte dans une chaîne de caractères car je n'arrivais pas utiliser ma variable "texte". Je précise que j'ai vu après que j'aurais pu utiliser la commande count('e') qui aurait fait la même chose.

    J'ai ensuite voulu faire la même chose avec toutes les lettres. J'aurais pu faire 26 boucles mais je me doute bien que c'est stupide. Donc j'ai fait cela :
    texte = open("fichier_texte.txt",'r')
    mon_texte_en_chaine_de_caractere = texte.read()
    decompte = {}
    for lettre in "abcdefghijklmnopqrstuvwxyz":
        decompte[lettre] = 0
        for i in mon_texte_en_chaine_de_caractere:
            if i == lettre:
                decompte[lettre] = decompte[lettre] + 1
    print(decompte)
    texte.close  
    

    A priori, ça me rend bien ce que je veux, mais il y a un détail qui m'embête : Python me rend sous la forme {'c': 2, 'w': 0, 'z': 0, 'j': 0, 't': 4, 'r': 6, 'n': 7, 'b': 1, 'y': 0, 's': 2, 'q': 1, 'l': 3, 'o': 6, 'e': 11, 'i': 7, 'h': 1, 'f': 2, 'v': 0, 'g': 1, 'k': 0, 'u': 4, 'x': 0, 'm': 4, 'a': 3, 'd': 1, 'p': 2}. Est-ce que je peux trier ensuite par ordre alphabétique facilement ?
  • Salut,
    Non, les dictionnaires s'affichent dans un ordre arbitraire.
    Libre à toi d'écrire une ou des instructions pour afficher les lettres dans l'ordre alphabétique.
  • (aucun code n'est testé, il y a sûrement pleins d'erreurs de syntaxe)

    Tu peux déjà faire beaucoup plus simple (en tout cas, plus beaucoup plus rapide) :
    decompte = {}
    for lettre in "abcdefghijklmnopqrstuvwxyz":
       decompte[lettre] = 0
    for lettre in mon_texte:
       decompte[lettre] += 1
    

    Et même avec defaultdict on peut faire encore plus court et rapide (et en comptant même les caractères qui ne sont pas dans "abcdefghijklmnopqrstuvwxyz":
    import collections
    decompte = collections.defaultdic(lambda: 0)
    for lettre in mon_texte:
         decompte[lettre] += 1
    

    Et la solution ultime avec Counter :
    import collections
    decompte = collections.Counter(mon_texte)
    


    Pour répondre à ta question, oui, il te suffit de trier les couples (clefs,valeurs) (il trie dans l'ordre lexicographique):
    decompte_sorted =  sorted(decompte.items())
    

    Si tu veux encore pouvoir bénéficier de l'aspect dictionnaire (accès et modif en temps O(1) à une clef arbitraire), tu peux utiliser les OrderedDict:
    import collections
    decompte_sorted = OrderedDict(sorted(decompte.items())
    
  • Ou pour avoir exactement ce que tu veux, avec les même fonctionnalités que toi :
    import collections
    decompte = collections.OrderedDict()
    for lettre in "abcdefghijklmnopqrstuvwxyz":
         decompte[lettre] = 0
    for lettre in mon_texte:
         decompte[lettre] += 1
    

    (mais bon, l'intérêt d'avoir un OrderedDict ici me semble très limité, à voir ce que tu veux en faire derrière. Si tu veux juste afficher les valeurs dans l'ordre, le : decompte_sorted = sorted(decompte.items()) suffit amplement.)
  • Bonjour et merci de vos réponses. Donc c'est normal qu'il ne trie pas, mais on peut le faire par exemple avec sorted.

    Pour répondre à sebsheep, je ne ferai absolument rien des résultats, le but est juste d'apprendre les bases de Python. Dans le meilleur des cas, je prendrai un texte long et je calculerai la fréquence de chaque lettre, mais rien de plus.

    J'ai tenté d'utiliser le premier programme de sebsheep car le mien me semblait lourd, mais c'est qui me venait en premier. Mais ce programme plante. J'ai tenté de comprendre ce qu'il faisait pour le réparer :
    - il crée un ensemble vide appelée decompte
    - la première boucle for crée pour chaque lettre de l'alphabet un élément dans décompte correspondant à la lettre et met cet élément à 0
    - la deuxième boucle for parcourt le texte lettre par lettre et ajoute 1 à la lettre correspondante dans la liste.
    Apparemment, ce qu'il n'aime pas, c'est quand il tombe sur une lettre qui n'est pas dans les lettres admises, donc j'ai regardé le second programme, qui répare cela puisque j'imagine que collections permet d'avoir toutes les lettres et pas seulement les 26 de l'alphabet. Mais à priori, j'ai un problème avec la fonction lambda, qui est censé tout mettre à 0. Quand j'exécute seulement :
    collections.defaultdict(lambda _: 0)
    

    (après avoir chargé collections), j'ai l'erreur :
    defaultdict(<function <lambda> at 0x0000000004B90950>, {})
    
    

    Est-ce que ce ne serai pas encore une erreur comme celle de mon tout premier message, du fait que j'utilise Python 3 ?
  • Ça peut impressioner de prime abord, mais ce n'est pas une erreur, c'est la représentation textuelle du defaultdict : il te dit que c'est un defaultdict, dont la fonction de "defaut" est une fonction lambda (et il te donne l'adresse de la fonction...).

    Tu as forcément un truc du genre :
    Traceback (more recent call last):
    ...
    <Nom de l'exception>: <description de l'exception>
    
    Essaie de faire 1/0 dans une console pour voir.


    Pour le premier programme on peut corriger ainsi :
    decompte = {}
    for lettre in "abcdefghijklmnopqrstuvwxyz":
       decompte[lettre] = 0
    for lettre in mon_texte:
       if lettre in decompte:
           decompte[lettre] += 1
    

    EDIT : ou encore mieux :
    decompte = {}
    for lettre in mon_texte:
       if lettre in decompte:
           decompte[lettre] += 1
       else:
           decompte[lettre] = 0
    
  • Merci, par contre, j'initialiserais decompte[lettre] à 1 dans ton dernier programme (dans le message que tu as édité) ?

    Je dois dire que je n'ai pas compris ce que tu m'a dit sur le defautdict : j'ai son adresse mais je ne vois pas trop à quoi ça peut me servir puisque je veux juste l'afficher. Je faisais comme si c'était une liste mais il s'agit d'un dictionnaire, donc je devrais pouvoir obtenir le nombre d’occurrences du 'a' en faisant decompte.get("a"), mais il me rend None.
  • Bien sûr pour le decompte[lettre]=1.

    Tu n'as pas l'adresse du defaultdict mais celle de la fonction qui te sert à créer les nouvelles valeurs lorsque la clef n'existe pas. Mais en gros cette partie là de l'affichage ne te sers à rien, c'est la fin qui t'intéresse : le {} désigne le dictionnaire "normal".

    J'ai fait une erreur lors de la def du defaultdict, il faut "lambda: 0" au lieu de "lambda _: 0". Avec les defaultdict, la méthode get n'a pas beaucoup d'intérêt. Tu peux utiliser directement "[ ]". Exemple :
    >>> d=collections.defaultdict(lambda :0)
    >>> d["a"] # la clef "a" n'avait pas été initialisée mais le defaultdict construit tout seul la valeur par défaut
    0
    >>> d["b"] = d["b"] + 5
    >>> d["b"]
    5
    >>> d["b"] = d["b"] + 5
    >>> d["b"]
    10
    >>> d
    defaultdict(<function <lambda> at 0x7f458f6426a8>, {'b': 10, 'a': 0})
    
  • Ok je comprends mieux. Je teste tout cela, merci de ta patience.
  • En une ligne :
    decompte={c:mon_texte.count(c) for c in set(montexte)}
    
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • decompte={c:mon_texte.count(c) for c in set(montexte)}
    

    Une ligne certes, mais niveau perfs, c'est pas terrible...
  • Autant utiliser ord, alors:
    decompte=[0]*26
    for c in mon_texte:
      decompte[ord(c)-97]+=1
    
    Mais on suppose que le texte ne contient que les minuscules, rien d’autre.
    Ma solution précédente est universelle.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Dans les posts précédents, j'ai proposé plusieurs méthodes "universelles" et "performantes".
  • Et pourquoi ce n’est pas performant, tu as testé sur un gros texte ?
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Avec ta première version :
    decompte={c:mon_texte.count(c) for c in set(montexte)}
    

    si tu as $n$ caractères différents dans ton texte, tu parcours $n+1$ ton texte (1 fois pour construire le set + 1 fois par count). En estimant qu'on trouve à peu près 100 caractères différents (majuscules/minuscules/ponctuations...), ça te fait un facteur 100. Sur de grosses données, ce n'est pas un facteur négligeable.

    Mais... Du coup j'ai fait des tests, et je suis tombé sur un résultat surprenant : ta version est un peu plus lente que collections.Counter, mais on n'a pas du tout le facteur 100... voir ici.
  • Cela ne m’étonne pas, je parie que Counter fait à peu près la même chose.
    Par ailleurs, je ne sais pas ce que fait Python en interne et il doit lui aussi optimiser un poil. En fait, les écritures en une ligne sont rapides car elles n’utilisent pas de copies de valeurs entre variables.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Re bonjour

    Je viens de m'apercevoir qu'il y a beaucoup de posts sur le langage python .
    Je suis vraiment le roi de la gaffe . A+
  • Bonjour,

    est-ce qu'il est possible de définir plusieurs listes, dont les noms sont liste1, liste2, etc ?

    Pour que ce soit plus clair, j'ai une liste. Chacun de ses éléments est une liste L dont le premier terme est une chaîne de caractères (disons un prénom) et le deuxième terme est un nombre (disons une année de naissance). Les années de naissances vont de 1900 à 2016 et je veux créer une liste pour chacun de ces années (dont le nom serait liste_année) et mettre dans cette liste les prénoms qui correspondent à l'année.

    Donc je voudrais parcourir définir 1017 listes vides puis je parcourrait ma liste L, lirait le deuxième terme n de cet élément puis ajouterait la chaîne de caractère à la liste correspondante.
  • Oui en python on peut, mais c'est un peu dégueu (en tout cas pour faire ce que tu veux faire).
    Pourquoi ne pas :
    * créer une liste L de taille 1017, dont toutes les cases contiennent une liste vide : la première case représente l'année 1900, la deuxième 1901...
    * parcourir ta liste initiale et mettre dans L les prénoms de l'année 1900+i
    ?

    Une fois que tu l'auras fait de cette manière, tu pourras le faire de façon beaucoup plus pythonique avec un petit "defaultdict".
  • C’est possible mais ne le fais pas avec le pourtant élégant [[]]*1017 mais avec [[] for _ in range(1017)] sinon tu auras toujours 1017 exemplaires de la même sous-liste.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Merci, effectivement c'est plus simple d'avoir une liste de listes que des listes distinctes.

    Je m'en suis sorti sans problème avec :
    M = [[] for _ in range(2016 - 1900 + 1)]
    for i in range(len(L) - 1):
        M[L[i][1] - 1900].append(L[i][0])
    print(M)
    

    (L étant ma liste dont chaque élément est une liste dont le premier élément est un prénom et le deuxième est une année de naissance).

    Je vais essayer de regarder ce defaultdict vu que mon exemple est simple. Par curiosité, j'ai essayé d'utiliser la commande à ne pas utiliser de Nicolas et elle ne marche pas chez moi (sous Python 3) : quand je fais
    M = [[]*1017]
    
    j'obtiens une liste dont le seul terme est la liste vide et non 1017 listes vides.
  • C'est normal :
    []*1017
    
    est identique à
    [] + [] + ... + []
    
    Et donc on a bien la liste vide au final (de la même manière que $0+0+0+\dots+0 = 0$).

    Nicolas a dû vouloir écrire trop vite et voulais dire
    [[]] * 1017
    
    en sachant que
    [a] * 1017 == [a, a, \dots, a]
    
    et en remplaçant a par [], on peut croire naïvement qu'on a ce qu'il faut... Mais non, comme expliqué par Nicolas précédemment.
  • Ok, merci, je n'ai pas fait attention qu'il y avait une faute de frappe. Et effectivement, avec le .append, ça ne fait pas ce que j'attends.
  • Oui, merci.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
Connectez-vous ou Inscrivez-vous pour répondre.
Success message!