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 :

Deux list en dict


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    prof d'histoire ?!?
    Inscrit en
    Février 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : prof d'histoire ?!?

    Informations forums :
    Inscription : Février 2015
    Messages : 22
    Par défaut Deux list en dict
    bonjour,

    Est il possible de transformer deux listes de longueur différentes ?
    genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    v = ['un', 'deux', 'trois', 'quatre', 'cinq', 'six']
    k = ['s1', 's2', 's3']
    array = []
     
    for n in v:
        dictionary = dict(zip(k, v))
        array.append(dictionary)
    résultat obtenu : [{'s1': 'un', 's2': 'deux', 's3': 'trois'}, {'s1': 'un', 's2': 'deux', 's3': 'trois'}, {'s1': 'un', 's2': 'deux', 's3': 'trois'}, {'s1': 'un', 's2': 'deux', 's3': 'trois'}, {'s1': 'un', 's2': 'deux', 's3': 'trois'}, {'s1': 'un', 's2': 'deux', 's3': 'trois'}]
    resultat esperé : [{'s1': 'un', 's2': 'deux', 's3': 'trois'}, {'s1': 'quatre', 's2': 'cinq', 's3': 'six'}]

    où est ce que je me trompe ...???
    Merci

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    Citation Envoyé par nina29000 Voir le message
    où est ce que je me trompe ...???
    Si votre boucle crée un dictionnaire à chaque itération, avec for n in v vous allez créer 6 dictionnaires.
    Si vous n'en vouliez que 2, c'est mal parti...

    Si vous découpiez v en morceaux de longueur 3 (la taille de k), çà marcherait mieux puisque 2 = 6 / 3.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Pour faire ce découpage qu'indique @wiztricks, le slicing est une méthode possible,

    C'est déjà très bien d'avoir eu l'idée d'utiliser dict(zip(...)) pour faire cet exercice.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 26
    Par défaut resultat
    Hello,

    je te propose une solution un peux plus flexible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    def lePlusPetit(a, b):
        if len(a) < len(b):
            return a
        else:
            return b
     
     
    def lePlusGrand(a, b):
        if len(a) > len(b):
            return a
        else:
            return b
     
    loop = itertools.cycle(lePlusPetit(v, k))
    c = [(next(loop), x) for x in lePlusGrand(v, k)]
    print(c)

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bonjour,

    une solution un peux plus flexible
    Que veux-tu dire par plus flexible ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def lePlusPetit(a, b):    
        if len(a) < len(b):
            return a
        else:         
            return b
    Pour ton code, il ne répond pas au besoin du PO, pas sous la forme voulue...

    Je vois des else inutiles dans ton code.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 26
    Par défaut
    Fred, j’entend par flexible qu'il accepte deux listes peut importe qui est la plus grande et peux importe leur taille.

    Effectivement les else sont inutile merci. :p

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 831
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par nina29000 Voir le message
    Est il possible de transformer deux listes de longueur différentes ?
    genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    v = ['un', 'deux', 'trois', 'quatre', 'cinq', 'six']
    k = ['s1', 's2', 's3']
    resultat esperé : [{'s1': 'un', 's2': 'deux', 's3': 'trois'}, {'s1': 'quatre', 's2': 'cinq', 's3': 'six'}]
    Oui c'est possible. Mais attention aux détails car certes les deux listes sont de longueur différente mais la longueur de la seconde est un multiple parfait de la longueur de la première. Alors sera-ce toujours le cas ou est-ce juste un hasard ? La réponse à cette question conditionnera beaucoup l'algorithme.

    Voici l'algorithme pour le cas le plus général (donc qui fonctionnera aussi ici)
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    v=("un", "deux", "trois", "quatre", "cinq", "six", "sept")
    k=("s1", "s2", "s3")
     
    d=tuple(
    	(dict(zip(k, v[i*len(k):(i+1)*len(k)])))
    	for i in range((len(v) - 1) // len(k) + 1)
    )
    print(d)
    résultat: ({'s1': 'un', 's2': 'deux', 's3': 'trois'}, {'s1': 'quatre', 's2': 'cinq', 's3': 'six'}, {'s1': 'sept'})

    Et pour le cas particulier où v est toujours multiple de k
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    v=("un", "deux", "trois", "quatre", "cinq", "six")
    k=("s1", "s2", "s3")
     
    d=tuple(
    	(dict(zip(k, v[i*len(k):(i+1)*len(k)])))
    	for i in range(len(v) // len(k))
    )
    print(d)
    résultat: ({'s1': 'un', 's2': 'deux', 's3': 'trois'}, {'s1': 'quatre', 's2': 'cinq', 's3': 'six'})

    Citation Envoyé par BamBi25 Voir le message
    je te propose une solution un peux plus flexible
    plus flexible que quoi ? un comparatif "plus" implique une comparaison sinon ta phrase ne veut rien dire !!!

    Citation Envoyé par BamBi25 Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def lePlusPetit(a, b):
        if len(a) < len(b):
            return a
        else:
            return b
     
    def lePlusGrand(a, b):
        if len(a) > len(b):
            return a
        else:
            return b
    Voici une solution un peu (sans "x" à "peu" car ce n'est pas un verbe conjuqué mais un adverbe) plus flexible que la tienne (là il y a comparaison)
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def compar(a, o, b)
        import operator as op
        return a if {
            "<" : op.lt,
            ">" : op.gt,
            "<=" : op.le,
            ">=" : op.ge,
        }[o](len(a), len(b)) else b
    # compar()
     
    compar(x, "<", y)
    compar(x, ">", y)
    ...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Moi j'ai ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    v = ['un', 'deux', 'trois', 'quatre', 'cinq', 'six']
    k = ['s1', 's2', 's3']
     
    res = [dict(zip(k, n)) for n in (v[:len(k)], v[len(k):])]
    print(res)
    EDIT: Après si la taille de k est modifié, il faudra adapter, et vérifier aussi si la taille de v est plus grande que k.

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 831
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    EDIT: Après si la taille de k est modifié, il faudra adapter, et vérifier aussi si la taille de v est plus grande que k.
    Hé oui. Ta solution (bien que très élégante), part du principe que v sera toujours deux fois la taille de k.
    Maintenant si c'est le cas alors oui c'est "plus flexible" que la mienne
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Voilà plus flexible, j'ai pas le temps de faire tous les tests,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    v_trim = [v[i:i+len(k)] for i in range(0, len(v), len(k))]
    res = [dict(zip(k, n)) for n in v_trim]
    print(res)

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 831
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    j'ai pas le temps de faire tous les tests
    Je les ai faits pour toi. Ok, t'as gagné, ça fonctionne dans tous les cas (y compris mon premier exemple).
    Mais... on peut éviter v_trim => res=[dict(zip(k, n)) for n in (v[i:i+len(k)] for i in range(0, len(v), len(k)))]
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [PHP-JS] Lier deux listes déroulantes
    Par budiste dans le forum Langage
    Réponses: 6
    Dernier message: 15/11/2005, 15h36
  2. [WD5.5] Lier deux listes déroulantes
    Par grellierj dans le forum WinDev
    Réponses: 7
    Dernier message: 11/10/2005, 17h33
  3. [FLASH MX2004] Drag and drop entre deux List
    Par aldo-tlse dans le forum Flash
    Réponses: 15
    Dernier message: 24/09/2005, 01h10
  4. concatener deux listes
    Par adel25 dans le forum C++
    Réponses: 1
    Dernier message: 22/09/2005, 12h56
  5. [XLS] De deux listes déplacer les nouvelles entrées
    Par Henrique92 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/09/2005, 22h12

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