Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec des list dans une list

Sujet résolu
    16 septembre 2017 à 2:53:01

    Bonjour à tous,

    J'ai un problème avec une list dans mon code, déjà voici le code concerné :

    if not split[13][1:-1] in equipements:
       equipements.append([split[13][1:-1], 1])
    else:
       equipements[equipements.index([split[13][1:-1],1])][1] = equipements[equipements.index([split[13][1:-1],1])][1] + 1

    J'ai deux problème avec ce code :

    Ma liste "equipements", contient des lists de deux éléments. Du coup la comparaison de mon if ne fonctionne pas.

    De plus, la dernière ligne de mon code ne me paraît pas correct mais je ne sais pas trop comment l'écrire. En fait vu que mon if ne fonctionne pas, je ne passe jamais dans le else. Je n'ai donc jamais pu tester cette ligne.

    Voici à quoi peut ressembler ma list : [['toto',1],['tata',4],['tutu',2]]

    Le split[13][1:-1] que l'on peut voir va me retourner la valeur de l'élement 1 donc 'toto' ou 'tata' ou 'tutu'.

    Enfait je voudrais rechercher ce que ce split[13][1:-1] me renvoie dans ma list. Si il n'existe pas dans la list, l'insère avec la valeur 1 à coté equipements.append([split[13][1:-1], 1]) et si il est trouvé on incrémente le chiffre qui lui est associé.

    Voila j'espère que quelqu'un pourra m'aider.

    Merci d'avance.

    EDIT : Je suis en python 3

    -
    Edité par snake57 16 septembre 2017 à 2:58:24

    • Partager sur Facebook
    • Partager sur Twitter
      16 septembre 2017 à 9:16:48

      Si tu restes avec des listes, la solution serait d'itérer sur chaque élément d'equipements jusqu'à trouver l'élément recherché:

      wanted = split[13][1:-1]
      for index, (item, counter) in enumerate(equipements):
          if wanted == item:
              equipements[index][1] = counter + 1
              break
      else:
          equipements.append([wanted, 1])


      Mais le plus simple serait d'utiliser un dictionnaire. L'index serait l'élément et la valeur associé serait le compteur. Et du coup, plus besoin de boucle car l'accès est instantané (grâce à l'index):

      equipements = {"toto": 1, "tata": 4, "tutu": 2}
      
      wanted = split[13][1:-1]
      equipements[wanted] = equipements.get(wanted, 0) + 1
      print(equipements)
      
      
      # if wanted in equipements:
      #     equipements[wanted] += 1
      # else:
      #     equipements[wanted] = 1


      Les 4 dernières lignes sont la forme naïve de la ligne 4.

      • Partager sur Facebook
      • Partager sur Twitter
      Précepte: Le mieux est l'ennemi du bien
      Anonyme
        16 septembre 2017 à 9:18:20

        L'expression "list[a:b]" (un slicing) ne retourne pas un élément de la liste, mais une nouvelle liste des éléments contenus dans la liste de "a" à "b".

        >>> ls = [1, 2, 3, 4, 5, 6]
        >>> ls[2:-2]
        [3, 4]
        >>> ls[1:2]
        [2]
        >>> ls[5:-1]
        []


        Si tu veux un élément il faut utilise un index simplement : "list[0]".

        Mais ici c'est clairement un problème de structure de donnée ; il te faut un dictionnaire, pas une liste. Ou mieux encore un dictionnaire "Counter" :

        >>> from collections import Counter
        >>>
        >>> elements = ["toto", "tata", "tutu"]
        >>> equipements = Counter()
        >>>
        >>> for element in elements:
        ...     equipements[element] += 1
        ...
        >>> equipements
        Counter({'toto': 1, 'tata': 1, 'tutu': 1})

        -
        Edité par Anonyme 16 septembre 2017 à 9:21:11

        • Partager sur Facebook
        • Partager sur Twitter
          16 septembre 2017 à 17:51:46

          Bonjour à tous et merci pour vos réponses.

          Effectivement, un dictionnaire est beaucoup plus adapté à mes besoins.

          J'ai utilisé l'exemple de Olygrim qui fonctionne très bien :)

          • Partager sur Facebook
          • Partager sur Twitter

          Problème avec des list dans une list

          × 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.
          • Editeur
          • Markdown