Génerer valeurs dictionnaires différentes PYTHON 2.7

Résolu
boliro -  
 trifou -
Bonjour,
j'aimerai définir une fonction init_system_obstacle(obstacle) qui me permet de générer aléatoirement des chiffres entre 1 et 12 et les attribuer aux valeurs des clés de mon dictionnaire obstacle : "wun" "ch-sou1" "ch-sou2","puit1","puit2". J'ai trouvé cette solution, mais elle ne me semble pas pratique et pertinente du tout : tant que 1 premier puis second etc... élément est égale à un autre, on attribue une valeur aléatoire aux valeurs de clé. Comme ci-dessous :

def init_system_obstacle(obstacle): 
    obstacle["wum"]=random.randint(1,12) 
    obstacle["ch-sou1"]=random.randint(1,12)
    while obstacle["wum"]==obstacle["ch-sou1"]:
        obstacle["ch-sou1"]=random.randint(1,12)
    obstacle["ch-sou2"]=random.randint(1,12)
    while obstacle["ch-sou2"]==obstacle["ch-sou1"] or obstacle["ch-sou2"]==obstacle["wum"]:
        obstacle["ch-sou2"]=random.randint(1,12)
    obstacle["puit1"]=random.randint(1,12)
    while obstacle["puit1"]==obstacle["wum"] or obstacle["puit1"]==obstacle["ch-sou1"] or obstacle["puit1"]==obstacle["ch-sou2"]:
        obstacle["puit1"]=random.randint(1,12)
    obstacle["puit2"]=random.randint(1,12)
    while obstacle["puit2"]==obstacle["wum"] or obstacle["puit2"]==obstacle["ch-sou1"] or obstacle["puit2"]==obstacle["ch-sou2"] or obstacle["puit2"]==obstacle["puit1"]:
        obstacle["puit2"]=random.randint(1,12)
    print obstacle
    return obstacle


En espérant que vous puissiez m'aider, et que vous m'ayez compris

Je vous remercie

1 réponse

  1. trifou
     
    Bonsoir,

    En travaillant avec une liste de départ des nombres à laquelle on ôtera les nombres déjà utilisés.

    def init_system_obstacle(obstacle):
        numbers = list(range(1, 13))
        keys = ('wum', 'ch-sou1', 'ch-sou2', 'puit1', 'puit2')
        for key in keys:
            number = random.choice(numbers)
            numbers.remove(number)
            obstacle[key] = number
        return obstacle


    Bien plus concis avec random.sample, dict.update et zip

    def init_system_obstacle(obstacle):
        keys = ('wum', 'ch-sou1', 'ch-sou2', 'puit1', 'puit2')
        numbers = random.sample(range(1, 13), len(keys))
        obstacle.update(zip(keys, numbers))
        return obstacle
    0
    1. boliro
       
      Ah oui c'est largement plus simple en effet ! Merci beaucoup !!!
      Serait il possible que vous m'expliquiez le fonctionnement de cette ligne svp :
      obstacle.update(zip(keys, numbers)) 
      ?
      Merci
      0
      1. trifou > boliro
         
        Bonjour,

        zip
        sert à grouper les éléments de plusieurs itérables indexables en s'appuyant sur les positions.

        >>> t1 = ('a', 'b', 'c')
        >>> t2 = (1, 2, 3)
        >>> tuple(zip(t1, t2))
        (('a', 1), ('b', 2), ('c', 3))


        dict.update
        sert à ajouter des items au dictionnaire ou les mettre à jour s'ils sont déjà existants.

        On peut passer en paramètre de cette méthode un autre dictionnaire.

        >>> d = {'a': 5}
        >>> d.update(dict(a=2, b=9))
        >>> d
        {'a': 2, 'b': 9}


        Ou comme ce qui est fait avec zip, un itérable à 2 dimensions.

        >>> d = {'a': 5}
        >>> d.update((('a', 1), ('b', 2)))
        >>> d
        {'a': 1, 'b': 2}
        0