Python: ссылка на список объектов класса списков

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

Вот класс....

class Teams():

    def __init__(self, ID = None, Team = None, R = None, W = None, L = None):
        self._items = [ [] for i in range(5) ]
        self.Count = 0


    def addTeam(self, ID, Team, R=None, W = 0, L = 0):
        self._items[0].append(ID)
        self._items[1].append(Team)
        self._items[2].append(R)
        self._items[3].append(W)
        self._items[4].append(L)
        self.Count += 1

    def addTeamsFromFile(self, filename):
        inputFile = open(filename, 'r')
        for line in inputFile:
            words = line.split(',')
            self.addTeam(words[0], words[1], words[2], words[3], words[4])

    def __len__(self):
        return self.Count

Вот код в Main

startFileName = 'file_test.txt'
filename = startFileName

###########
myTestData = Teams()

myTestData.addTeamsFromFile(startFileName)

образец данных в файле

100,AAAA,106,5,0
200,BBBB,88,3,2
300,CCCC,45,1,4
400,DDDD,67,3,2
500,EEEE,90,4,1

Я думаю, что здесь хорошо (не уверен на 100%), но теперь, как мне ссылаться на эти данные, чтобы увидеть... я правильно не создаю класс? Как мне увидеть, если один экземпляр больше другого...

т.е. myTestData[2][2] > myTestData[3][2] <----- это где я запутался, так как это не работает

2 ответа

Почему бы вам не создать Team класс как это:

class Team():
    def __init__(self, ID, Team, R=None, W = 0, L = 0)
      # set up fields here

Затем в Teams

class Teams():
   def __init__(self):
       self._teams = []
   def addTeam (self, ID, Team, R=None, W = 0, L = 0)
       team = Team (ID, Team, R=None, W = 0, L = 0)
       self._teams.append (team)

Теперь, если я правильно понял, вы хотите перезаписать > поведение оператора.

Чтобы сделать эту перегрузку __gt__(self, other) [ссылка на сайт]

Так будет

class Team ():
   # init code from above for Team

    def __gt__ (self, otherTeam):
        return self.ID > otherTeam.ID # for example

Также не забудьте преобразовать эти строки в числа, потому что вы сравниваете строки, а не числа. использование int функция для этого.

Непосредственная проблема, с которой вы сталкиваетесь, заключается в том, что ваш код для доступа к данным команды не учитывает ваши myTestData значение, являющееся объектом, а не списком. Вы можете исправить это, выполнив:

myTestData._items[2][2] > myTestData._items[3][2]

Хотя, если вы планируете делать так много, я бы предложил переименовать _items к чему-то, что, очевидно, должно быть публичным. Вы также можете сделать addTeamsFromFile Метод преобразует некоторые значения, которые он читает, в целые числа (а не оставляет их в виде строк) перед передачей их в addTeam метод.

Альтернативой будет сделать ваш Teams поддержка класса прямого доступа члена. Вы можете сделать это, создав метод с именем __getitem__ (а также __setitem__ если вы хотите иметь возможность назначать значения напрямую). Что-то вроде:

def __getitem__(self, index):
    return self._items[index]

@ Ответ Александра о создании класса для командных данных также хорош. Фактически, может быть более полезным иметь класс для отдельных команд, чем иметь класс, содержащий несколько. Вы могли бы заменить Teams класс со списком Team экземпляров. Я думаю, это зависит от того, что ты собираешься делать с этим.

Другие вопросы по тегам