Pythonのwhileループを介して変数を動的に作成します。誰かがこれを行う創造的な手段を持っていますか?
大量の変数名を作成する必要性が圧倒的に高い場合を除き、キー名を動的に作成し、それぞれに値を関連付けることができる辞書を使用します。
a = {}
k = 0
while k < 10:
<dynamically create key>
key = ...
<calculate value>
value = ...
a[key] = value
k += 1
新しい「コレクション」モジュールには、適用可能な興味深いデータ構造もいくつかあります。
globals()で遊ぶことで可能になります:
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('__'))
1つの結果:
'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')
与える「変数」の名前と、作成する値を説明しないので、ランダムを使用しました。オブジェクトにバインドせずに名前を作成することはできないと思うからです。
Exec()メソッドを使用します。たとえば、ディクショナリがあり、各キーを元のディクショナリ値を持つ変数に変換したい場合、次のことができます。
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
グローバルな名前空間やローカルな名前空間に物事を詰め込むのは良い考えではありません。 dictを使用すると、他の言語に似たものになります... d['constant-key'] = value
は見苦しいだけです。 Pythonはオブジェクト指向です。マスターの言葉で: "" "名前空間は素晴らしいアイデアの1つです-それらをもっとやってみましょう!" ""
このような:
>>> 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'}
>>>
注:これは実際の回答ではなく、議論と見なされる必要があります。
おおよそのアプローチは、変数を作成するモジュールで__main__
を操作することです。たとえば、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
実行すると出力されます
$ python b.py
name 'B' is not defined
__main__ <module '__main__' from 'b.py'>
B: 1
しかし、このアプローチは単一のモジュールスクリプトでのみ機能します。インポートする__main__
は常にPythonによって実行されるエントリスクリプトのモジュールを表すため、これはb.py
が他のコードに関与している場合、B
変数がスコープ内に作成されることを意味しますb.py
自体ではなく、エントリスクリプトの。スクリプトa.py
があると仮定します。
#!/usr/bin/env python
# coding: utf-8
try:
import b
except NameError as e:
print e
print 'in a.py: B', B
実行すると出力されます
$ python a.py
name 'B' is not defined
__main__ <module '__main__' from 'a.py'>
name 'B' is not defined
in a.py: B 1
__main__
が'a.py'
に変更されていることに注意してください。
キーワードパラメーター ある関数から別の関数に変数を渡すことができます。このようにして、辞書のキーを変数名として使用できます(while
ループで設定できます)。辞書名は、呼び出されるときに**
を前に置く必要があります。
# 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
**
がなければ、kwargs
は単なる辞書です。
>>> print_name(kwargs)
{'name': 'python'}
vars()['meta_anio_2012'] = 'translate'