Структура данных Python для значений неупорядоченных пар из списка - PullRequest
0 голосов
/ 28 февраля 2019

Я, вероятно, не использую правильные ключевые слова, чтобы найти что-то полезное в этом (как вы могли бы сказать из неуклюжего заголовка), так что вот так:

Как я могу представить значения для париз одного списка?Например, в списке может быть лига команд (скажем, Красный , Золото и Синий , если коротко), играющих друг против друга, и значения результатакаждой игры.Каждый элемент списка (команда) связан со всеми остальными, и каждое сопряжение соответствует значению, которое мы можем назвать результатом.И обычным способом использования этой структуры было бы выбрать две команды, чтобы посмотреть результат матча.Пары не упорядочены, а команды не имеют особого статуса.

Самой очевидной вещью будет таблица (например, я использую Pandas, поэтому датафрейм), но она выглядит немного неловко, потому что ей придетсябудьте наполовину полными, если мы избегаем повторения.

enter image description here

«Команды» могут иметь две «игры» между ними (что часто встречается вспорт, во всяком случае), но в этом случае я думаю, что таблица будет еще хуже, потому что мы должны были бы придать некоторое значение частям выше и ниже диагонали (скажем, «раунд 1» и «раунд 2»), иэто не обобщается даже на большее количество соответствий (это должно быть сделано с помощью дополнительной переменной в верхней части «одиночного» списка).

enter image description here

Что такое "естественный "(вместо лучшего термина) способ представить это?(Под this я имею в виду исходную таблицу, то есть неупорядоченные пары из одного списка .)

PS : я упомянул кадры данных,но этот вопрос будет применяться к любому типу «таблицы» (например, dict of dicts).

PS2 : я упомянул «команды» только для иллюстрации.Пожалуйста, избегайте обсуждений спортивных вопросов!

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Я думаю, что лучше создавать объекты.

В файле Python:

class Team():
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return str(self.name)

class Game():
    def __init__(self, team_1, team_2, result):
        self.team_1 = team_1
        self.team_2 = team_2
        self.result = result

    def __str__(self):
        return f"{self.team_1} vs {self.team_2}: {self.result}"


# some tests
if __name__ == "__main__":
    red, gold, blue = Team("red"), Team("gold"), Team("blue")
    red_blue = Game(red, blue, "v1")
    red_gold = Game(red, gold, "v2")
    blue_gold = Game(blue, gold, "v3")
    print(red_blue, red_gold, blue_gold, sep="\n")

Если вы запустите файл, он выдаст:

red vs blue: v1
red vs gold: v2
blue vs gold: v3

РЕДАКТИРОВАТЬ: class League

# add this code in the same module that the previous one 

class League():
    def __init__(self, name):
        self.name = name
        self.teams = []
        self.games = []

    def add_teams(self, *teams):
        # *teams is a sequence of Team instances
        for team in teams:
            self.teams.append(team)

    def add_games(self, *games):
        # *games is a sequence of Game instances
        for game in games:
            self.games.append(game)

    def get_game_by_team(self, team):
        print(f"Results for all games of {team} in {self.name} league:")
        for game in self.games:
            if team == game.team_1.name or team == game.team_2.name:
                print(game)

if __name__ == "__main__":
    league = League("master")
    league.add_teams(red, gold, blue)
    league.add_games(red_blue, red_gold, blue_gold)
    league.get_game_by_team("red")
    league.get_game_by_team("blue")
    league.get_game_by_team("gold")

Вывод:

Results for all games of red in master league:
red vs blue: v1
red vs gold: v2
Results for all games of blue in master league:
red vs blue: v1
blue vs gold: v3
Results for all games of gold in master league:
red vs gold: v2
blue vs gold: v3

Это ответ на ваш вопрос?

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

0 голосов
/ 28 февраля 2019

Я бы предложил использовать словарь словаря, например,

Например,

{'red':{'gold':'v1','blue':'v2'},'gold':{'red':'v4','blue':'v3'},'blue':{'red':'v5','gold':'v6'}}

То есть

match = 0
>>> def get_next_match():
...     global match
...     match+=1
...     return match
...
>>> {team:{t:get_next_match() for t in teams if t!=team} for team in teams}
{'blue': {'gold': 6, 'red': 5}, 'gold': {'blue': 4, 'red': 3}, 'red': {'blue': 2, 'gold': 1}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...