web-dev-qa-db-fra.com

Comment créer dynamiquement des variables via une boucle while?

Je veux créer des variables dynamiquement via une boucle while en Python. Quelqu'un at-il un moyen créatif de le faire?

140
Noah R

À moins qu'il ne soit absolument nécessaire de créer un fouillis de noms de variables, je voudrais simplement utiliser un dictionnaire, dans lequel vous pouvez créer dynamiquement les noms de clé et associer une valeur à chacun.

a = {}
k = 0
while k < 10:
    <dynamically create key> 
    key = ...
    <calculate value> 
    value = ...
    a[key] = value 
    k += 1

Il existe également des structures de données intéressantes dans le nouveau module "Collections" qui pourraient être applicables:

http://docs.python.org/dev/library/collections.html

124
JoshAdel

jouer avec globals () permet:

import random

alphabet = Tuple('abcdefghijklmnopqrstuvwxyz')


print '\n'.join(repr(u) for u in globals() if not u.startswith('__'))

for i in xrange(8):
    globals()[''.join(random.sample(alphabet,random.randint(3,26)))] = random.choice(alphabet)

print

print '\n'.join(repr((u,globals()[u])) for u in globals() if not u.startswith('__'))

un résultat:

'alphabet'
'random'

('hadmgoixzkcptsbwjfyrelvnqu', 'h')
('nzklv', 'o')
('alphabet', ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'))
('random', <module 'random' from 'G:\Python27\lib\random.pyc'>)
('ckpnwqguzyslmjveotxfbadh', 'f')
('i', 7)
('xwbujzkicyd', 'j')
('isjckyngxvaofdbeqwutl', 'n')
('wmt', 'g')
('aesyhvmw', 'q')
('azfjndwhkqgmtyeb', 'o')

J'ai utilisé aléatoire parce que vous n'expliquez pas les noms des "variables" à donner et les valeurs à créer. Parce que je ne pense pas qu'il soit possible de créer un nom sans le lier à un objet.

52
eyquem

Utilisez la méthode exec (). Par exemple, supposons que vous possédiez un dictionnaire et que vous souhaitiez transformer chaque clé en une variable avec sa valeur de dictionnaire d'origine.

Python 2

>>> c = {"one": 1, "two": 2}
>>> for k,v in c.iteritems():
...    exec("%s=%s" % (k,v))

>>> one
1
>>> two
2

Python

>>> c = {"one": 1, "two": 2}
>>> for k,v in c.items():
...    exec("%s=%s" % (k,v))

>>> one
1
>>> two
2
40
chris-piekarski

Insérer des éléments dans les espaces de noms globaux et/ou locaux n'est pas une bonne idée. Utiliser un dict est tellement bizarre ... d['constant-key'] = value a l'air bizarre. Python est OO. Comme le dit un maître: "" "Les espaces de noms sont une bonne idée: faisons-en plus!" ""

Comme ça:

>>> class Record(object):
...     pass
...
>>> r = Record()
>>> r.foo = 'oof'
>>> setattr(r, 'bar', 'rab')
>>> r.foo
'oof'
>>> r.bar
'rab'
>>> names = 'id description price'.split()
>>> values = [666, 'duct tape', 3.45]
>>> s = Record()
>>> for name, value in Zip(names, values):
...     setattr(s, name, value)
...
>>> s.__dict__ # If you are suffering from dict withdrawal symptoms
{'price': 3.45, 'id': 666, 'description': 'duct tape'}
>>>
26
John Machin

NOTE: Ceci devrait être considéré comme une discussion plutôt que comme une réponse réelle.

Une approche approximative consiste à utiliser __main__ dans le module avec lequel vous souhaitez créer des variables. Par exemple, il y a un b.py:

#!/usr/bin/env python
# coding: utf-8


def set_vars():
    import __main__
    print '__main__', __main__
    __main__.B = 1

try:
    print B
except NameError as e:
    print e

set_vars()

print 'B: %s' % B

En cours d'exécution il sortirait

$ python b.py
name 'B' is not defined
__main__ <module '__main__' from 'b.py'>
B: 1

Mais cette approche ne fonctionne que dans un seul script de module, car __main__ il importera toujours le module du script d’entrée exécuté par python, cela signifie que si b.py est impliqué par un autre code, le La variable B sera créée dans la portée du script d'entrée plutôt que dans b.py lui-même. Supposons qu'il existe un script a.py:

#!/usr/bin/env python
# coding: utf-8

try:
    import b
except NameError as e:
    print e

print 'in a.py: B', B

En cours d'exécution il sortirait

$ python a.py
name 'B' is not defined
__main__ <module '__main__' from 'a.py'>
name 'B' is not defined
in a.py: B 1

Notez que le __main__ est remplacé par 'a.py'.

3
Reorx

Paramètres de mot-clé vous permettent de passer des variables d'une fonction à une autre. De cette façon, vous pouvez utiliser la clé d'un dictionnaire comme nom de variable (pouvant être rempli dans votre boucle while). Le nom du dictionnaire doit simplement être précédé de ** quand il est appelé.

# create a dictionary
>>> kwargs = {}
# add a key of name and assign it a value, later we'll use this key as a variable
>>> kwargs['name'] = 'python'

# an example function to use the variable
>>> def print_name(name):
...   print name

# call the example function
>>> print_name(**kwargs)
python

Sans **, kwargs n'est qu'un dictionnaire:

>>> print_name(kwargs)
{'name': 'python'}
3
Joe Bergantine
vars()['meta_anio_2012'] = 'translate'
1
Pjl