Python: создание нового имени на основе значения в нескольких словарях - PullRequest
0 голосов
/ 30 декабря 2018

Относительно плохо знаком с python, извиняюсь, если вопрос / сценарий многословны и расплывчаты.Сценарий ниже возвращает ключ и значение имени команды, которую искали (Пример: 2, Шарлотта Хорнетс);Тем не менее, я также хотел бы вернуть название лиги, в которой он находится.Такие как 'nfl', 'nba', 'mlb';на основе словаря, в котором он находится (например: 2, Шарлотта Хорнетс, НБА).Некоторое время работал над этим, но не могу найти динамического решения.Заранее спасибо за помощь!

NFL_Teams = {1: "Arizona Cardinals", 2: "Atlanta Falcons", 3: "Baltimore Ravens"}
NBA_Teams = {1:'Washington Wizards', 2:'Charlotte Hornets', 3: 'Atlanta Hawks'}
MLB_Teams = {1: 'Los Angeles Dogers', 2: 'Cincinnati Reds', 3: 'Toronto Blue Jays'}    

def Standings(reply):
    def dictionary_search(name, dictionary):
        for key, value in dictionary.items():
            if value == name:
                return True # Boolean to show if team name is in merged dictionaries. 
            if key == name:
                pass # Used as a throw-away variable

    for single_dictionary in (NFL_Teams, NBA_Teams, MLB_Teams):
        if dictionary_search(reply, single_dictionary):
            for key, value in single_dictionary.items():
                if reply == value:
                    print(key, value)
            break
    else:
        print('Please Try Again')

Standings('Charlotte Hornets')

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Важны ли числа, используемые в качестве ключей?Имеет ли смысл читать их в словари наоборот?- тогда вы можете использовать оператор try except KeyError.Это может быть предпочтительным для очень больших словарей (хотя это не будет иметь место здесь для команд в лиге).Это также может быть более объектно-ориентированный способ мышления: название команды является идентификатором объекта, в то время как (я предполагаю, что числа являются текущими позициями лиги?) Позиция лиги является свойством (и в этом случае изменяемым).Так, например (адаптируя ответ Aaron_ab)

teams = {'NFL': {"Arizona Cardinals":1, "Atlanta Falcons":2, "Baltimore Ravens":3},
     'NBA': {'Washington Wizards':1, 'Charlotte Hornets':2, 'Atlanta Hawks':3},
     'MLB': {'Los Angeles Dogers':1, 'Cincinnati Reds':2, 'Toronto Blue Jays':3}}

def standings(team):
    for league, teams_dict in teams.items():
        try:
            teams_dict[team]
            print(teams_dict[team], team)
            print(league)
            break
        except KeyError:
            continue   

В качестве альтернативы, отбросьте числа и получите словарь списков (где порядок списка является текущим порядком лиги):

import numpy as np

teams = {'NFL': ["Arizona Cardinals", "Atlanta Falcons", "Baltimore Ravens"],
     'NBA': ['Washington Wizards', 'Charlotte Hornets', 'Atlanta Hawks'],
     'MLB': ['Los Angeles Dogers', 'Cincinnati Reds', 'Toronto Blue Jays']}

def standings(team):
    for league, teams_list in teams.items():
        if team in teams_list:
            print(team, np.where(np.array(teams_list)==team)[0])
            print(league)
0 голосов
/ 30 декабря 2018

Как только вы присваиваете dict другому var, называемому «single_dictionary», вы фактически теряете имя. Поэтому я попытался сопоставить имя лиги с исходным диктатом команд.

Работает на:

teams = {'NFL': {1: "Arizona Cardinals", 2: "Atlanta Falcons", 3: "Baltimore Ravens"},
         'NBA': {1:'Washington Wizards', 2:'Charlotte Hornets', 3: 'Atlanta Hawks'},
         'MLB': {1: 'Los Angeles Dogers', 2: 'Cincinnati Reds', 3: 'Toronto Blue Jays'}}

# NFL_Teams = {1: "Arizona Cardinals", 2: "Atlanta Falcons", 3: "Baltimore Ravens"}
# NBA_Teams = {1:'Washington Wizards', 2:'Charlotte Hornets', 3: 'Atlanta Hawks'}
# MLB_Teams = {1: 'Los Angeles Dogers', 2: 'Cincinnati Reds', 3: 'Toronto Blue Jays'}

def standings(reply):
    for league, single_dictionary in teams.items():
        if reply in single_dictionary.values():
            for key, value in single_dictionary.items():
                if reply == value:
                    print(key, value)
                    print(league)
            break
    else:
        print('Please Try Again')

standings('Charlotte Hornets')

Будет печатать:

2 Charlotte Hornets
NBA
...