Как создать бесконечный вложенный словарь в Python 3 через пользовательский ввод - PullRequest
0 голосов
/ 09 января 2019

В настоящее время я беру свой первый курс по Python, и у меня нет опыта в CS. Я работаю над гипотетической программой, которая включает в себя небольшие проблемы из наших тем для обсуждения и задания по критическому мышлению, чтобы попрактиковаться в использовании кода таким способом, который имеет смысл для меня (я публицист и фотограф). На данный момент программа представляет собой клиентскую базу данных для публициста, которая добавляет информацию о клиенте, печатает полный список клиентов и рассчитывает удержание налогов.

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

Для ветки программы "ДОБАВИТЬ" я хотел бы иметь возможность добавлять новые клиенты / информацию во вложенный словарь (client_info). Программа задает пользователю ряд вопросов, таких как идентификатор клиента, название группы, дата окончания контракта, оплата и управление. Я надеюсь использовать какой-то цикл, чтобы пользователь мог добавить несколько полос в словарь client_info, и программа автоматически обновит и создаст новый словарь для каждой полосы в словаре client_info.

Сначала я заполнил client_info четырьмя группами и их информацией. Затем я создал пустые словари (с присвоением номеров для каждого пустого словаря) и написал индивидуальный код для каждого пустого словаря (всего 10), но это означало, что у меня было много кода, и я не мог найти способ переработать код для оптимизировать программу.

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

# Define dictionary for client information
client_info = {1: {'band' : 'colfax_speed_queen','email' :  'csq@colfaxspeedqueen.com', 'contract' : '20190808', 'pay' : int(800), 'mgmt' : 'MGI'},
         2: {'band' : 'the_ghoulies', 'email' : 'tg@theghoulies.com', 'contract' : '20191031', 'pay' : int(250), 'mgmt' : 'DIY'},
         3: {'band' : 'hail_satan', 'email' : 'hs@hailsatan.com', 'contract' : '20190606', 'pay' : int(700), 'mgmt' : 'APG'},
         4: {'band' : 'plastic_daggers', 'email' : 'pd@plasticdaggers.com', 'contract' : '20190420', 'pay' : int(1000), 'mgmt' : 'DIY'}}

# Pretend to create infinite nested dictionary for client information, but ultimately fail
c = 4
while c <= 19:
    c += 1
    client_info[c] = {}

# General greeting
print("Welcome to the client database.")

# Directions to use database
main_menu = str("""You can:
    PRINT your client list.
    ADD a new client to the database.
    Calculate your TAX withholding.""")
print(main_menu, "\nWhat would you like to do?")
access_client = input()

# Add client to database
elif access_client.lower() == 'add':

    while access_client.lower() == 'add':

        # Request user input for client id
        print("\nWhat is the client id?")

        # Update client id
        c = int(input())

        # Request user input for client_info[c]['band']
        print("What is the name of the band?")

        # Update client_info[c]['band']
        client_info[c]['band'] = input()

        # Request user input for client_info[c]['email']
        print("What is " + client_info[c]['band'] + "\'s email address?")

        # Update client_info[c]['email']
        client_info[c]['email'] = input()

        # Request user input for client_info[c]['contract']
        print("When does " + client_info[c]['band'] + "\'s contract end?")

        # Update client_info[c]['contract']
        client_info[c]['contract'] = int(input())

        # Request user input for client_info[c]['pay']
        print("What is your payment from " + client_info[c]['band'] + "?")

        # Update client_info[c]['pay']
        client_info[c]['pay'] = int(input())

        # Request user input for client_info[c]['mgmt']
        print("Who is managing " + client_info[c]['band'] + "?")

        # Update client_info[c]['mgmt']
        client_info[c]['mgmt'] = input()

        # Notify user that system has been updated with client information
        print("\nThank you for adding " + client_info[c]['band'] + "\'s information to the client database. The database has been updated.")
        print(client_info[c])
        print(client_info)

        # Ask user to add another client
        print("\nType ADD to add another client. Hit any other key to return to the main menu.")
        add_client = input()
        if add_client.lower() != 'add':
            break
    print(main_menu)

Цикл while c <= 19 работает так, как я хочу, но если пользователь не знает номер последнего идентификатора клиента, он может случайно перезаписать предыдущую запись. Если вы напечатаете полный словарь, то будут напечатаны все пустые словари до 20. Если бы я хотел иметь возможность иметь 200 записей в своем словаре, было бы неприятно, чтобы все эти пустые словари распечатывались, когда я хочу увидеть полный список клиентов. Поскольку в данный момент у меня есть 4 записи в словаре, у меня должно быть c = 4 выше цикла while c <= 19. (Мы не обсуждали, как сохранить содержимое пользовательского ввода в данный момент, но я предполагаю, что это будет проблемой, когда я знаю, как сохранить.) Мне нужно будет обновлять c = # каждый раз, когда я использовал программу. И если я использую c = 0, он удаляет записи, которые я уже сохранил в словаре. </p>

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

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Вы можете подумать о том, чтобы сделать что-то вроде необработанного примера ниже:

ids = client_info.keys()
next_c = max(ids) + 1

fields = ['band', 'email', 'contract', 'pay', 'mgmt']

for field in fields:
    print("Enter ", field)
    client_info[next_c][field] = input()

Основная идея - найти следующий c для использования в качестве идентификатора в поисках максимального фактического идентификатора + 1. Это позволяет избежать использования уже использованных идентификаторов, но не, если последний был удален. Чтобы избежать повторного использования уже использованного идентификатора вместо удаления объекта, установите для него значение None (для примера):

client_info = {1: None, .....}

Объявите поля, которые необходимо заполнить, в списке, чтобы вы могли перебирать его и сохранять код СУХОЙ.


Это только отправная точка для дальнейшей настройки. Например, настройка ответов:
fields_2 = {'band': 'What is the name of the band?', 'email': 'What is the band email address?', 'contract':'When does contract ends?', 'pay':'What is your payment from the band?', 'mgmt':'Who is managing the band'}
for field, answer in fields_2.items():
    print(answer)
    # client_info[next_c][field] = input()

Итак, пользователь мог видеть:

# What is the name of the band?
# What is the band email address?
# When does contract ends?
# What is your payment from the band?
# Who is managing the band?
0 голосов
/ 09 января 2019

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

Ваша программа может автоматически рассчитать новый идентификационный номер клиента, используя что-то вроде len(client_info) или len(client_info) + 1, чтобы получить новый номер на основе количества записей, которые у вас уже есть. Вот очень краткий пример этого с очень упрощенной записью клиента:

client_info = {} # start empty

while True:
    new_client = {}
    name = input("what is the band's name? ")
    new_client['name'] = name
    new_client_id = len(client_info) # starts at zero, add 1 if you want the IDs to start at 1
    client_info[new_client_id] = new_client

    print("client added, client_info is now", client_info)

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

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