自动创建变量并赋值

2024-09-28 22:19:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有话要说

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中做到这一点?你知道吗


Tags: 示例floatsplitp2p3p1p15
3条回答

方法1(最坏的方法):

正如其他人所提到的,您可以通过globals()或稍微安全一些的locals()实现您想要做的事情

不过,我强烈建议你不要那样做。这是糟糕的编码实践。如果你一开始就不能手工打出来,为什么还要手工打出来呢?实际上没有理由需要将该值作为局部变量,特别是考虑到将其添加到globals/locals所做的一切实际上就是将其添加到另一个字典中。你知道吗

方法2:保持原样

保持现状有什么不对?是这样的:

s[1]

p1

方法3:使用字典

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

那么

numbers["p1"]

方法4:Getattr方法

如果你真的需要速记的话,我建议你用一个getattr集来命名一个类,你可以给任何你想方便的东西命名,比如。请记住,方法不能以数字开头:

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

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

你可以这样使用它:

x = MyClass(s)
x.p1

你可以这样使用它:

方法5:Python魔法!你知道吗

结合使用property类、元类和newmagic方法。这是过分的,但至少你学会了python的一个好技巧。你知道吗

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

下面是你将如何使用它。你知道吗

x = SClassRep()
x.p1

您可以使用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'}

这样做不好,最好在s上使用迭代,但是如果您想要:

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

相关问题 更多 >