0
from visual import *

planet = ['merc','venus','earth','mars','jupiter','saturn','uranus','neptune']
planetv = [2, 3, 4, 5, 6, 7, 8, 9]
planetp = [10, 20, 30, 40, 50, 60, 70, 80]

本质上,我想创建如下新变量:

merc.m = 2
venus.m = 3
earth.m = 4

...

merc.p = 10
venus.p = 20
earth.p = 30

...

在不更改planet列表的情况下,我将需要稍后在代码中访问“merc”、“venus”等。

4

4 回答 4

4

如果我理解正确,您希望使用 list 给出的名称创建全局变量planet,每个变量都绑定到具有属性的对象m和,分别p设置为列表中的值planetvplanetp

如果这是正确的,这是一种方法:

# Create a class to represent the planets.  Each planet will be an
# instance of this class, with attributes 'm' and 'p'.
class Planet(object):
    def __init__(self, m, p):
        self.m = m
        self.p = p

# Iterate over the three lists "in parallel" using zip().
for name, m, p in zip(planet, planetv, planetp):
    # Create a Planet and store it as a module-global variable,
    # using the name from the 'planet' list.
    globals()[name] = Planet(m, p)

现在你可以这样做:

>>> merc
<__main__.Planet instance at 0x...>
>>> merc.m
2
>>> merc.p
10
于 2012-03-07T15:23:43.013 回答
2

好吧,行星只是字符串,所以你不能在它们上设置属性。此外,像费迪南德建议的那样动态创建大量全局变量很少是一个好主意,最好使用dict.

基于费迪南德的回答,我建议将行星的名称作为一个属性(我想你会发现你会需要它)。现在,您可以将这些Planet对象放在 adict或 a中list(以保留顺序),无论您当时的需要是什么,并且在任何一种情况下,所有相关信息都随时可用。

planet = ['merc','venus','earth','mars','jupiter','saturn','uranus','neptune']
planetv = [2, 3, 4, 5, 6, 7, 8, 9]
planetp = [10, 20, 30, 40, 50, 60, 70, 80]

class Planet(object):
    def __init__(self, name, m, p):
        self.name = name
        self.m = m
        self.p = p

planets = [Planet(name, m, p) for name, m, p in zip(planet, planetv, planetp)]
planet_dict = dict((p.name, p) for p in planets)

for p in planets:
    print "{0}: {1} {2}".format(p.name, p.m, p.p)
print "Mass of earth: {0}".format(planet_dict["earth"].m)

编辑:忘记我之前的建议,我改变了主意。

于 2012-03-07T15:29:22.143 回答
0

为了简单起见,我会使用字典来创建映射。

像这样 -

planet = ['merc','venus','earth','mars','jupiter','saturn','uranus','neptune']
planetv=[2,3,4,5,6,7,8,9]
planetp=[10,20,30,40,50,60,70,80]

planet_map = {}

for i, p in enumerate(planet):
    planet_map[p] = {'m': planetv[i],
                     'p': planetp[i],
                    }

print planet_map

现在您可以访问planet_map['merc']['m']planet_map['merc']['p'].

于 2012-03-07T15:24:54.093 回答
0

你有没有想过用字典来做这个?

planetv_dic = {'merc':2, 'venus': 3,'earth':4,'mars': 5,'jupiter': 6,'saturn': 7,'uranus': 8,'neptune': 9}

planetp_dic = {'merc':10, 'venus': 20,'earth':30,'mars': 40,'jupiter': 50,'saturn': 60,'uranus': 70,'neptune': 80}

或者假设您已经有一个列表,请使用 for 循环构建您的字典:

 planetv_dic = {}
 planetp_dic = {}
 for i in xrange(len(planet)):
    planetv_dic[planet[i]] = planetv[i]
    planetp_dic[planet[i]] = planetp[i]

然后你可以使用类似的东西访问你的行星列表

 planetv_dic.keys()
于 2012-03-07T15:28:58.383 回答