Génerer valeurs dictionnaires différentes PYTHON 2.7 [Résolu]

-
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
Afficher la suite 

1 réponse

0
Merci
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
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
> 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}
Commenter la réponse de trifou