Как лучше всего печатать словари, созданные из пользовательских переменных экземпляра? - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь организовать своих коров в словарь, получить доступ к их значениям и распечатать их на консоли.

Каждый экземпляр коровы присваивается индексу в списке коров.

Я пытаюсь создать словарь следующим образом:

for i in cows:
    cowDict[i.getName] = (i.getWeight, i.getAge)

Я бы хотел получить доступ к значениям моего словаря, используя имена моих коров, а именно:

c["maggie"]

однако мой код выдает ключевую ошибку.

Если я распечатаю весь словарь, я получаю что-то такое:

"{<'связанный метод cow.getName of <' magg ie, 3, 1 >>: (<'связанный метод cow.getWeight of <' magg ie, 3, 1 >>, <'связанный метод cow.getAge of <' magg ie, 3, 1 >> ), et c ... } "

Я могу заменить .getName на переменную экземпляра и получить желаемый результат, однако, мне посоветовали отказаться от этого подхода.

Как лучше всего создавать словарь, используя переменные экземпляра типа cow?

Код:

class cow(object):
    """ A class that defines the instance objects name, weight and age associated
        with cows
    """
    def __init__(self, name, weight, age):
        self.name = name
        self.weight = weight
        self.age = age
    def getName(self):
        return self.name
    def getWeight(self):
        return self.weight
    def getAge(self):
        return self.age
    def __repr__(self):
        result = '<' + self.name + ', '  + str(self.weight) + ', ' + str(self.age) + '>'
        return result

def buildCows():
    """
    this function returns a dictionary of cows
    """
    names = ['maggie', 'mooderton', 'miles', 'mickey', 'steve', 'margret', 'steph']
    weights = [3,6,10,5,3,8,12]
    ages = [1,2,3,4,5,6,7]
    cows = []
    cowDict = {}
    for i in range(len(names)):
        #creates a list cow, where each index of list cow is an instance 
        #of the cow class
        cows.append(cow(names[i],weights[i],ages[i]))
    for i in cows:
        #creates a dictionary from the cow list with the cow name as the key
        #and the weight and age as values stored in a tuple
        cowDict[i.getName] = (i.getWeight, i.getAge)
    #returns a dictionary
    return cowDict

c = buildCows()

Ответы [ 3 ]

1 голос
/ 11 апреля 2020

getName - это функция, поэтому попробуйте

for i in cows:
    cowDict[i.getName()] = (i.getWeight(), i.getAge())
0 голосов
/ 11 апреля 2020

Это похоже на работу для zip . Мы можем использовать его в сочетании с пониманием dict для создания словарей из произвольных выражений ключей и значений следующим образом

{name: (weight, age) for name, weight, age in zip(names, weights, ages)}`

Затем мы можем переопределить buildCows, поскольку

def buildCows():
    names = ['maggie', 'mooderton', 'miles', 'mickey', 'steve', 'margret', 'steph']
    weights = [3,6,10,5,3,8,12]
    ages = [1,2,3,4,5,6,7]
    return {name: (weight, age) for name, weight, age in zip(names, weights, ages)}

Python имеет политика открытых дверей для атрибутов класса, поэтому они по умолчанию публикуются c, если только перед их именами не стоит подчеркивание или двойное подчеркивание (дундер). Как правило, нет необходимости создавать методы получения / доступа, как это было бы во многих других ОО-языках. Если вам действительно нужны закрытые переменные экземпляра, вы можете прочитать о них здесь

Причиной ошибочных результатов в dict было то, что он заполнялся ссылками на функции вместо вызывая их (т.е. i.getWeight должен был быть `i.getWeight ()

0 голосов
/ 11 апреля 2020

Вы можете упростить это с помощью чего-то вроде:

names = ['maggie', 'mooderton', 'miles', 'mickey', 'steve', 'margret', 'steph']
weights = [3,6,10,5,3,8,12]
ages = [1,2,3,4,5,6,7]

cows = {names[i]: (weights[i], ages[i]) for i in range(len(names))}

for name in names:
    print '<%s, %d, %d>' % (name, cows[name][0], cows[name][1])

Какие выходы:

<maggie, 3, 1>
<mooderton, 6, 2>
<miles, 10, 3>
<mickey, 5, 4>
<steve, 3, 5>
<margret, 8, 6>
<steph, 12, 7>
...