我有一个字符串说
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中执行此操作吗?
答案 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