Управление списком для повышения эффективности кода, борьба - PullRequest
0 голосов
/ 07 марта 2012
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 голосов
/ 07 марта 2012

Если я вас правильно понял, вы хотите создать глобальные переменные с именами, указанными в списке planet, с каждой переменной, связанной с объектом, имеющим атрибуты m и p, и установить значения в списки planetv и planetp соответственно.

Если это правильно, вот способ сделать это:

# 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
2 голосов
/ 07 марта 2012

Ну, планеты - это просто строки, поэтому вы не можете устанавливать на них атрибуты.Более того, динамическое создание множества глобальных переменных, как предполагает Фердинанд, очень очень редко хорошая идея, лучше использовать dict.

Опираясь на ответ Фердинанда, я предлагаю включить название планеты в качестве атрибута (думаю, вы обнаружите, что оно вам понадобится).Теперь вы можете иметь эти Planet объекты в dict или 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)

РЕДАКТИРОВАТЬ: Забудьте мое предыдущее предложение, я передумал.

0 голосов
/ 07 марта 2012

Думал ли ты сделать это со словарями?

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()
0 голосов
/ 07 марта 2012

Для простоты я бы использовал словарь для создания сопоставления.

Как это -

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'].

...