web-dev-qa-db-ja.com

whileループを介してどのように変数を動的に作成できますか?

Pythonのwhileループを介して変数を動的に作成します。誰かがこれを行う創造的な手段を持っていますか?

135
Noah R

大量の変数名を作成する必要性が圧倒的に高い場合を除き、キー名を動的に作成し、それぞれに値を関連付けることができる辞書を使用します。

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

新しい「コレクション」モジュールには、適用可能な興味深いデータ構造もいくつかあります。

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

120
JoshAdel

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')

与える「変数」の名前と、作成する値を説明しないので、ランダムを使用しました。オブジェクトにバインドせずに名前を作成することはできないと思うからです。

46
eyquem

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
37
chris-piekarski

グローバルな名前空間やローカルな名前空間に物事を詰め込むのは良い考えではありません。 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'}
>>>
26
John Machin

注:これは実際の回答ではなく、議論と見なされる必要があります。

おおよそのアプローチは、変数を作成するモジュールで__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'に変更されていることに注意してください。

3
Reorx

キーワードパラメーター ある関数から別の関数に変数を渡すことができます。このようにして、辞書のキーを変数名として使用できます(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'}
3
Joe Bergantine
vars()['meta_anio_2012'] = 'translate'
0
Pjl