Génerer valeurs dictionnaires différentes PYTHON 2.7
Résolu
boliro
-
trifou -
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 :
En espérant que vous puissiez m'aider, et que vous m'ayez compris
Je vous remercie
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
-
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- 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}
-