自动创建变量和赋值

时间:2015-10-28 10:08:06

标签: python python-2.7

我有一个字符串说

s = ['799.58812', '437.90386', '282.94545', '1.8511', '6.31', '-0.2928', '0.0687', '0.3615', '19.0002', '0.021375', '-76.404702', '-76.401867', '-76.400922', '-76.422349', '6.002']

现在我想将每个值存储在一个单独的变量中。

我知道可以通过简单的p1 = float(s.split()[1])来完成。

但我想要一些基于长度的新变量应该自动创建并存储值

示例:

p1 = 799.58812
p2 = 437.90386
p3 = 282.94545
....
....
....
p15 = 6.002

任何人都可以告诉我如何在python中执行此操作吗?

3 个答案:

答案 0 :(得分:1)

做这些事情是个坏主意,最好在s上使用迭代,但如果你想要:

for n, value in enumerate(s, start=1):
    globals()["p%d"%n] = float(value)

答案 1 :(得分:1)

您可以使用globals()来实现目标,即

s = ['799.58812', '437.90386', '282.94545', '1.8511', '6.31', '-0.2928', '0.0687', '0.3615', '19.0002', '0.021375', '-76.404702', '-76.401867', '-76.400922', '-76.422349', '6.002']
for index, item in enumerate(s):
    globals()['p%s' % (index+1)] = float(item)

将产生名为p1 ... p15的​​变量,或者,我喜欢的方法是将它们放在你自己的字典中。

sdict = dict(('p%s' % (index+1), item) for index, item in enumerate(s))

print sdict
{'p1': '799.58812',
 'p10': '0.021375',
 'p11': '-76.404702',
 'p12': '-76.401867',
 'p13': '-76.400922',
 'p14': '-76.422349',
 'p15': '6.002',
 'p2': '437.90386',
 'p3': '282.94545',
 'p4': '1.8511',
 'p5': '6.31',
 'p6': '-0.2928',
 'p7': '0.0687',
 'p8': '0.3615',
 'p9': '19.0002'}

答案 2 :(得分:1)

方法1(最糟糕的方式):

正如其他人提到的那样,你可以实现你想要用globals()或稍微更安全的本地人()

做的事情。

但是,我强烈建议你不要这样做。这是一个糟糕的编码实践。如果您不能手动输入,那么为什么需要手动输入?确实有一个原因是你需要将值作为局部变量,特别是考虑到你通过将它添加到全局/局部变量所做的一切实际上是将它添加到另一个字典中。

方法2:保持原样

将它保留原样有什么不对?就是这样:

private function getPostForm()
{
    $form=$this->createFormBuilder()
    ->add(...
}

public function addPost()
{
   $form=$this->getPostForm... (is a createFormBuilder
   // form to create new post
   // display form to add - send to updatePost
}

public function editPost()
{
   $form=$this->getPostForm... (is a createFormBuilder
   // get post id and display form to edit post
   // send to updatePost
}

public function updatePost()
{
   // get data from post and validate
   $form->bind(...
   // if validate is true => save
   if($form->isValid())....
   // if not => get errors and display
   else { 
   // redirect and display errors and post data
}

VS

s[1]

方法3:使用字典

p1

然后

numbers = {"p{}".format(i):s[i] for i in range(len(s)}

方法4: Getattr方法

如果您真的需要速记,我会建议使用 getattr 设置的课程,您可以命名任何您想要方便的东西。请记住,方法不能以数字开头:

numbers["p1"]

你会像这样使用它:

class MyClass(object):
    def __init__(self, lst):
        self.s = lst

    def __getattr__(self, name):
        try:
            return self.s[int(name[1:])]
        except:
            raise AttributeError()

你会像这样使用它:

方法5: Python Magic!

使用属性类,元类和魔术方法的组合。这有点矫枉过正,但至少你在python中学到了一个很好的技巧。

x = MyClass(s)
x.p1

以下是您将如何使用它。

s = ['799.58812', '437.90386', '282.94545', '1.8511', '6.31', '-0.2928', '0.0687', '0.3615', '19.0002', '0.021375', '-76.404702', '-76.401867', '-76.400922', '-76.422349', '6.002']

def create_property(index):
    def getr(self):
        return s[index]
    def setr(self, value):
        s[index] = value
    def delr(self):
        raise AttributeError("Cannot delete this field")
    return property(getr, setr, delr)

class PropertyCreatorClass(type):
    def __new__(mcs, clsname, bases, dct):
        for i in range(len(s)):
            dct["p{}".format(i)] = create_property(i)
        return type.__new__(mcs, clsname, bases, dct)

class SClassRep(object):
    __metaclass__ = PropertyCreatorClass