IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

TypeError: 'int' object is not iterable


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut TypeError: 'int' object is not iterable
    Rebonjour !!

    mon problème est que je souhaite comparer entre les élements de deux listes et que si deux élements correspondent alors je crée une nouvelle liste et je mets l'element correspondant à l'intérieur : en python ça donne la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def SplitDom( liste1,liste2 ) :     # on separe les domaines en ceux possedant un patch et ceux qui n'en ont pas
        split_1 = []
        split_2 = []
        for clk in liste1:
             for cl in liste1[2]:  # il s'agit de la liste split et liste2 c'est patch
                  for blk in liste2:
                       for clk in liste2[0]:     # il s'agit du tag initiaux des domaines generaux
    		   # il s'agit des tags initiaux des domaines contenant des patchs
                           if blk == clk:  # on s'assure que le domaine k contient bien un patch
                           split_1.append(liste1) # si oui  on cree une liste pour les domaines contenant des patchs
    	               else:
                           split_2.append(liste1) # sinon on cree une autre liste pour les domaines qui ne contiennent pas de patch.
        return ( split_1, split_2 ) # on retourne les deux listes
    je reçois comme erreur :
    TypeError: 'int' object is not iterable


    Est ce que vous auriez une idée de comment surmonter cela??

    Merci d'avance !!

    Manal

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonjour,

    hmm le message d'erreur indique que c'est un appel à range() qui foire et je n'en vois pas dans ton code source. ça doit être ailleurs

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut
    Je viens de corriger mon erreur, et j'ai mis le bon type d'erreur !!

    j'avais mis range avant dans mpn code dans les boucles for pour voir ce que ça changeait! mais ça ne changeait que le type d'erreur !

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 673
    Par défaut
    Salut,

    les for cl in liste1[2]: # il s'agit de la liste split et liste2 c'est patch
    et for clk in liste2[0]: # il s'agit du tag initiaux des domaines generaux
    supposent "implicitement" que le contenu de liste1[2] et de liste2[0] sont des 'iterables'
    L'erreur TypeError: 'int' object is not iterable dit qu'ils n'en sont pas?

    Pour le reste, je ne sais que dire car si la description suggère qu'on part d'une liste de... dans laquelle on fait un tri pour retourner une liste avec et une liste sans. Je ne comprends pas trop pourquoi nous avons deux listes en entrée.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut
    Le but de la fonction est de comparer deux listes ( liste1 et liste 2), en comparant le 3ème élement de la liste1 (liste1[2]) et du premier element de la liste 2 (liste2[0]) puis ensuite de créer une nouvelle liste des élements de la liste 1 en cas d'égalité et d'une autre liste en cas de différence.
    je veux donc qu'il parcoure les élements de la liste2[0] et qu'il les compare avec les élements de la liste1[2]

    liste2[0]=[2, 1, 2, 1] # par exemple
    liste1[2]=[11,11,5,2,4,6,1,5,8,7,3]

    voilà!!!

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 673
    Par défaut
    Citation Envoyé par manaliac Voir le message
    Le but de la fonction est de comparer deux listes ( liste1 et liste 2), en comparant le 3ème élement de la liste1 (liste1[2]) et du premier element de la liste 2 (liste2[0]) puis ensuite de créer une nouvelle liste des élements de la liste 1 en cas d'égalité et d'une autre liste en cas de différence.
    je veux donc qu'il parcoure les élements de la liste2[0] et qu'il les compare avec les élements de la liste1[2]

    liste2[0]=[2, 1, 2, 1] # par exemple
    liste1[2]=[11,11,5,2,4,6,1,5,8,7,3]

    voilà!!!
    Cela suppose que les éléments liste2[0] et liste1[2] soient eux même des listes. L'erreur (le contenu n'est pas itérable) montre que ce n'est pas le cas.
    Donc:
    liste2[0] n'est pas de la forme [2, 1, 2, 1]
    et liste1[2] n'est pas de la forme [11,11,5,2,4,6,1,5,8,7,3]

    A partir de là, vous avez un problème de conception grand mot pour dire que si votre algorithme se base sur des hypothèses fausses, les résultats seront tellement incertains qu'il ne mérite par encore d'être codé.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 673
    Par défaut
    Par contre, si nous ignorons le reste, la formulation:

    Le but de la fonction est de comparer deux listes ( liste1 et liste 2), en comparant le 3ème élement de la liste1 (liste1[2]) et du premier element de la liste 2 (liste2[0]) puis ensuite de créer une nouvelle liste des élements de la liste 1 en cas d'égalité et d'une autre liste en cas de différence
    dit:
    si liste1[2] == liste2[0] alors
    retourner 'egalité', copie de liste1
    sinon
    retourner 'différente', copie de liste1?? quelle autre liste?
    Ensuite la question peut être de savoir comment réaliser '==' dans le cas ou les éléments sont des entiers ou des listes.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut
    Si les deux élements sont diférents alors on retourne la meme liste mais sous un nom différent !

    Voilà ce que j'ai fait, et ça marche assez ( dans le sens que j'ai un résultat correct mais qu'il faut que j'améliore pour avoir la forme exacte de la solution):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        for blk in liste1:
            for clk in liste2:     
                if blk[2] == clk[0]:
                   split_1.append(blk)
                   print " liste1",split_1 # si oui  on cree une liste pour les domaines contenant des patchs
                else:
                   split_2.append(blk)

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 673
    Par défaut
    salut
    Citation Envoyé par manaliac Voir le message
    Si les deux élements sont diférents alors on retourne la meme liste mais sous un nom différent !
    ? voyons voir...
    Voilà ce que j'ai fait, et ça marche assez ( dans le sens que j'ai un résultat correct mais qu'il faut que j'améliore pour avoir la forme exacte de la solution):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        for blk in liste1:
            for clk in liste2:     
                if blk[2] == clk[0]:
                   split_1.append(blk)
                   print " liste1",split_1 # si oui  on cree une liste pour les domaines contenant des patchs
                else:
                   split_2.append(blk)

    Ca fait quelque chose de sensiblement différent de ce que vous racontiez ce matin:
    Code pseudo : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    pour blk dans liste1:
        pour  clk dans liste2:
            si blk[0] == clk[0],
                ajout du blk dans split_1
             sinon ajout dans split_2
    autrement dit dans split_1 nous aurons autant d'occurence de blk que la condition blk[0] == clk[0] a été satisfaite et dans split2 les autres occurences.

    Vous pourriez faire:
    Code pseudo : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    results = {}
    pour blk dans liste1
        results[blk] = dict( split_1: 0, split_2: 0}
        pour clk dans liste2
             si blk[0] == clk[0]:
                  results[blk]['split_1'] += 1
             sinon
                  results[blk]['split_2'] += 1
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut
    autrement dit dans split_1 nous aurons autant d'occurence de blk que la condition blk[0] == clk[0] a été satisfaite et dans split2 les autres occurences
    Je suis tout à fait d'accord que cela me crée des doublons dans mes listes résultats !!
    et cela me préoccupe , donc je vois pas comment placer mon nouvelle_liste.append(blk) pour que je n'aie pas de doublons!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    results = {}
    pour blk dans liste1
        results[blk] = dict( split_1: 0, split_2: 0}
        pour clk dans liste2
             si blk[0] == clk[0]:
                  results[blk]['split_1'] += 1
             sinon
                  results[blk]['split_2'] += 1
    Est ce que vous pourriez me dire à quoi correspond votre code??


    De plus quand mon programme devient ( j'ajoute une nouvelle liste split_2 quand la condition if n'est pas remplie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       for blk in liste1:
            for clk in liste2:     # il s'agit du tag initiaux des domaines generaux
    		   # il s'agit des tags initiaux des domaines contenant des patchs
                if clk[0] == blk[2]:
                   split_1.append(blk)
                   print " liste1: domaines contenant patch",split_1 # si oui  on cree une liste pour les domaines contenant des patchs
                else: # j'ajoute cette partie à mon code !!
                   split_2.append(blk)

    la liste Split_2 contient entièrement la liste1 et avec des doublons !!
    ça veut dire que le else n'est pas correct !
    Auriez vous une idée d'une autre commande ou autre?

    Manal

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 673
    Par défaut
    la liste Split_2 contient entièrement la liste1 et avec des doublons !!
    ça veut dire que le else n'est pas correct !
    Ben comme vous mettez blk dans split_2 ou split_1 en fonction de ce qui trouve dans les différents élements de liste2, il y a de fortes chances de retrouviez un ou plusieurs blk dans les deux split_x...
    Le 'else' est correct : il ne fait pas ce que vous espériez.

    Auriez vous une idée d'une autre commande ou autre?
    Tant que vous n'aurez pas écrit en français ce que ca doit faire... impossible de vous aider à traduire cela en Python.
    Désolé
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut
    Je vais redire ce que mon programme doit réaliser :

    Je possède deux listes liste1 et liste2 à deux dimensions
    Exemple:
    liste1 = [[1,5,2,36,62],[2,5,4,1,2],[2,5,36,1,2],[2,5,2,1,251]]
    liste2 = [[1,5,2,36],[2,5,4,1],[3,5,3,6]]

    Je souhaite séparer ma liste1 en deux sous-listes; et cela en fonction d'un critère qui est : si chaque premier élément des sous-listes de la liste2 correspond au deuxième élément d'une des sous-listes de la liste1, alors je retiens toute la sous-liste et je la mets dans une nouvelle liste nv_liste1 sinon dans une nouvelle_liste2.

    voilà!!

  13. #13
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 673
    Par défaut
    Citation Envoyé par manaliac Voir le message
    Je vais redire ce que mon programme doit réaliser :

    Je possède deux listes liste1 et liste2 à deux dimensions
    Exemple:
    liste1 = [[1,5,2,36,62],[2,5,4,1,2],[2,5,36,1,2],[2,5,2,1,251]]
    liste2 = [[1,5,2,36],[2,5,4,1],[3,5,3,6]]

    Je souhaite séparer ma liste1 en deux sous-listes; et cela en fonction d'un critère qui est : si chaque premier élément des sous-listes de la liste2 correspond au deuxième élément d'une des sous-listes de la liste1, alors je retiens toute la sous-liste et je la mets dans une nouvelle liste nv_liste1 sinon dans une nouvelle_liste2.

    voilà!!
    Ben "chaque premier élément des sous-listes de la liste2" ici = [ 1, 2, 3]
    S'ils sont différents, la condition égal à "deuxième élément d'une des sous-listes de la liste1" sera toujours fausse.
    Dans ces conditions, on prend l'ensemble des premiers éléments de la liste2,
    • s'ils sont différents: toutes les sous listes de liste1 vont dans nouvelle_liste2
    • s'ils sont égaux, les éléments de liste1 dont le deuxième est cette valeur vont dans nouvelle_liste1

    Est ce que cette reformulation vous paraît correcte?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  14. #14
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut
    Bonjour,

    Dans ces conditions, on prend l'ensemble des premiers éléments de la liste2,

    * s'ils sont différents: toutes les sous listes de liste1 vont dans nouvelle_liste2
    * s'ils sont égaux, les éléments de liste1 dont le deuxième est cette valeur vont dans nouvelle_liste1
    Vous voulez dire par là de changer ma condition if en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        for blk in liste2:
            for clk in liste1:     
                if blk[0] != clk[2]:
                   split_1.append(clk) # on ajoute les éléments différents dans une nouvelle ss-liste
                   #print " liste1: domaines ne contenant pas de patch",split_1 
                else:
                   split_2.append(clk) # quand les éléments de la liste2 égalent ceux de la liste1
    Je ne sais pas vraiment si j'ai bien intérprété votre idée!! En tout cas le resultat reste faux pour la condition if

    Manal

  15. #15
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut
    Rebonjour !!

    J'ai refait mon programme différemment et pour l'instant ça marche !

    J'explique ce que j'ai fait :
    J'ai mis la condition suivante :

    Si le premier élément de ma liste2 (clk[0]) est égal au troisième élément de ma liste1 (blk[2]) alors je crée une nouvelle liste split_1 ( jusque là rien de nouveau !) , ensuite je récupère l'index de l'élément correspondant dans la liste1 , puis je le supprime ! et ainsi j'ai ma deuxième liste qui satisfait ma 2ème condition (ie: créer une 2ème liste ou figurent les éléments qui n'ont pas satisfait la 1ère condition !!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        for clk in liste2:
            for blk in liste1:     # liste2 fait reference au patch et liste1 a split
                if blk[2] == clk[0]:
                   split_1.append(blk) # on ajoute ttes les infos concernant le domaine contenant un elt dans une liste
                   liste_rm = liste1
                   aka = liste_rm.index(blk) # on recupere l'index du block contenant le bn elt dans la liste1: split
                   liste_rm.pop(aka) # puis on supprime l'element de la liste_rm ou liste1
                   split_2 = liste_rm # et ca nous cree la liste des domaines ne contenant pas de patchs
                   print " on supprime un block par boucle",split_2
                else:
                   split_2 = liste1 # il n y a pas de patch
    Pour le moment ça marche ! Qu'en pensez vous ?

    Manal

  16. #16
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 673
    Par défaut
    Salut,
    Je n'en pense rien car "çà ne fait pas d'erreur" ne signifie pas que cela fait ce que vous attendez puisque (à mon sens) vous n'avez toujours pas écrit cela proprement. Mais si cela vous convient, pourquoi pas...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. TypeError:'Nonetype' object is not iterable
    Par Mozard Yao dans le forum Odoo (ex-OpenERP)
    Réponses: 2
    Dernier message: 30/05/2014, 11h42
  2. TypeError: 'int' object is not iterable
    Par lewiss66 dans le forum Général Python
    Réponses: 2
    Dernier message: 18/10/2012, 16h37
  3. Erreur " 'int' object is not iterable"
    Par ti'chou dans le forum Général Python
    Réponses: 14
    Dernier message: 25/09/2012, 17h24
  4. "'int' object is not callable"
    Par dingoth dans le forum Général Python
    Réponses: 2
    Dernier message: 22/12/2010, 17h38
  5. TypeError: 'file' object is not callable
    Par MariemEA dans le forum Général Python
    Réponses: 7
    Dernier message: 09/07/2010, 21h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo