Назовите тот же ключ - Пример 39 Выучите Python трудный путь - PullRequest
1 голос
/ 08 июля 2020

новичок в программировании и работе с Zed Shaw's Learn Python3 The Hard way.

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

Вот мой исходный код:

states = {
    'Pennsylvania': 'PA',
    'Maryland': 'MD',
    'Texas': 'TX'}

cities = {
    'PA': 'State College',
    'PA': 'Spring Mills',
    'PA': 'Pittsburgh',
    'PA': 'Philadelphia',
    'PA': 'Eerie',
    'MD': 'Frederick',
    'MD': 'Salisbury',
    'MD': 'Swanton',
    'MD': 'Baltimore',
    'TX': 'Midland',
    'TX': 'Dallas',
    'TX': 'Houston',
    'TX': 'Galveston'
}

for state, abbrev in states.items():
    x = "%s is abbreviated: %s" % (state, abbrev)
    print(x)

for abbrev, city in cities.items():
    x = "%s has the city %s in it" % (abbrev, city)
    print(x)

Следующее, что я обнаружил, это то, что вы можете использовать список в качестве значения в dict. Поэтому я попробовал это вместо этого и сделал вложенный l oop для вызова каждого города индивидуально:

states = {
    'Pennsylvania': 'PA',
    'Maryland': 'MD',
    'Texas': 'TX'}

cities = {
    'PA': ['State College',
    'Spring Mills',
    'Pittsburgh',
    'Philadelphia',
    'Eerie'],
    'MD': ['Frederick',
    'Salisbury',
    'Swanton',
    'Baltimore'],
    'TX': ['Midland',
    'Dallas',
    'Houston',
    'Galveston']
}

for state, abbrev in states.items():
    x = "%s is abbreviated: %s" % (state, abbrev)
    print(x)

for abbrev, city in cities.items():
    count = 0
    for i in cities.get(abbrev):
        city_list = cities.get(abbrev)
        x = "%s has the city %s in it" % (abbrev, city_list[count])
        print(x)
        count += 1

Мой вопрос в том, есть ли лучший (более упрощенный?) Метод сопоставления нескольких городов с одним состояние и получить это значение позже, или если список внутри dict - лучший метод здесь. Возможно, я еще не нашел лучшего метода в книге, но готов ответить на все вопросы. Спасибо, что нашли время, чтобы прочитать сообщение. Надеюсь, это было не слишком долго.

Ответы [ 3 ]

0 голосов
/ 08 июля 2020

Понятие словаря и списков неплохое. Я вижу такие вещи, когда работаю с API. Я мог бы упростить ваш второй 'for l oop' до:

for abbrev, cities in cities.items():
    for city in cities:
        print("%s has the city %s in it" % (abbrev, city))

Что здесь также важно, относительно измененного кода - проблемы могут возникнуть, если вы или кто-то еще добавит в словарь следующий пара (ключ = значение), где значение не будет списком. Новая пара должна содержать значение в виде списка, даже с одним элементом.

Взгляните на defaultdict, чтобы предоставить некоторые действия для блокировки возможных проблем, если вы хотите продолжить свой контейнер таким образом.

Как уже упоминалось в JD Rud ie, класс также является отличным решением для удобочитаемости и производительности. Чтобы понять причину, поищите информацию, касающуюся словаря совместного использования ключей.

0 голосов
/ 10 июля 2020

Как упоминалось ранее, спасибо вам обоим за ответы. Последние два дня я изучал классы и основы OOP. Я принял оба ваших совета и написал следующий новый код:

class State(object):

    def __init__ (self, State, Abbrev, City):
        self.State = State
        self.Abbrev = Abbrev
        self.City = City

states = [
    'Pennsylvania',
    'Maryland',
    'Texas']

states.sort()

Abbrev_dict = {'Pennsylvania':'PA','Maryland': 'MD','Texas': 'TX'}

city_dict = {
    'PA': ['State College',
    'Spring Mills',
    'Pittsburgh',
    'Philadelphia',
    'Eerie'],
    'MD': ['Frederick',
    'Salisbury',
    'Swanton',
    'Baltimore'],
    'TX': ['Midland',
    'Dallas',
    'Houston',
    'Galveston']
}

state_list = []
for state in states:
    abbrev = Abbrev_dict[state]
    cities = city_dict[abbrev]
    state_list = State(state, abbrev, cities)
    print(state_list.State, state_list.Abbrev, state_list.City)

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

edit: Если бы я собирался сделать это для всех 50 состояния, я бы сначала отсортировал список «состояний» в алфавитном порядке, иначе, глядя на объекты в state_list, вы не узнаете, какой объект соответствует какому состоянию, если бы вы хотели вызвать переменную.

edit: ^ ^ добавил сортировку к коду, чтобы перечислить состояния в алфавитном порядке

0 голосов
/ 08 июля 2020

Я не вижу ничего плохого в том, что вы сделали - вероятно, я бы так поступил, если бы мне пришлось решать эту проблему. Единственное улучшение, которое вы можете сделать, о котором, вероятно, будет упомянуто позже в книге, - это создание класса для каждого состояния с последующим сохранением аббревиатуры в атрибуте, например:

class State:
def __init__(self, name, abbreviation, cities):
    self.name = name
    self.abbreviation = abbreviation
    self.cities = cities
    
penn = State("Pennsylvania", "PA", ["Pittsburgh", "Philadelphia", "Hershey"])
print(penn.name)
print(penn.abbreviation)
print(penn.cities)

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

Продолжайте в том же духе!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...