Ключ вложенного словаря, пара значений не правильно Printing-Python - PullRequest
0 голосов
/ 11 февраля 2019

Когда я читаю «Ускоренный курс Python» Эрика М., в главе 9 он вводит произвольный аргумент ключевого слова в разделе «Словарь».Я решил работать над контактной книгой, основываясь на знаниях, которые я получил до сих пор.Вот код.

import random

print('Enter choice 1-6:'),'\n'
print('', '1-Create new profile','\n',
      '2-Update existing profile','\n',
      '3-Delete a profile','\n',
      '4-View Directory','\n',
      '5-Search Directory','\n',
      '6-Exit Profile program')

#Global Variables
user_names={} # used in name_dictionary() to store names only
user_ids=[] # used to contain randomly generated user ids
user_directory={} # will combine userid and names in a new dictionary

#name_dictionary is a dictionary that saves names as ('last_name', 'jones', 'first_name', 'jim')
def name_dictionary(**options):
    fn=input('Enter first name: ')
    user_names['first_name']=fn
    ln = input('Enter last name: ')
    user_names['last_name'] = ln

    for key,value in user_names.items():
        user_names[key]=value

    choice=input('You can add additional items such as phone, email-Add/No')
    if (choice=='y'):
        em = input('Enter email address: ')
        options['email'] = em
        phn = input('Enter phone: ')
        options['phone'] = phn

        for key, value in options.items():
            options[key] = value

        for key,value in user_names.items():
            for k, v in options.items():
                print()
        return(key,value,k,v)

    else:
        print('Extra information not added')
        for k, v in user_names.items():
            return (k, v)

# generate_id is a list that randomly generates userids andsaves in a list example user_id69
def generate_id():
    # as of now I am not focusing on generating unique random or checking for dup id
    user_id = 'user_id' + str(random.randint(0, 100))
    user_ids.append(user_id)

    return user_id


# addUserIDToDict is a dictionary adds the names and ids to a dictionary which should look like
# user_id69 ('last_name', 'jones', 'first_name', 'jjim')
def addUserUserIDToDict():
    user_directory[generate_id()] = name_dictionary()
    while True:
        # user_directory[generate_id()] = name_dictionary()
        print('Add another entry?(stop to quit)')
        choice = input()
        if (choice == 'y' and choice != 'stop'):
            user_directory[generate_id()] = name_dictionary()

        else:
            break

    return user_directory


# search_user function, lets user search by Id or Name
def search_user():
    search_option = input('Search by name or id?:..')

    if (search_option == 'name'):
        search_name = input('Enter name')
        for k, v in user_directory.items():
            for key, value in user_names.items():
                if (search_name == value):
                    print()
        print(search_name, ' found in directory')
        print('That name is in position', key)


    else:
        print('That name not found')

    if (search_option == 'id'):
        search_id = input('What is the id: ?')
        if search_id in user_directory.keys():
            print(search_id, ' found in directory')
            print(user_directory.get(search_id))

        else:
            print(search_id, ' not found in directory')


# Prints value of items in user directory
def print_directory():
    print('==View Current Directory==')
    if (len(user_directory) == 0):
        print('No entry to show')
    else:
        for k, v in user_directory.items():
            print(k, v)


# Used for finding a name by last or first name and then modify/change the name
def modify_profile():
    print("You can modify names or an entry to add additional items")

    modify_name = input('Enter name to modify')

    for k, v in user_directory.items():
        for key, value in user_names.items():
            if(modify_name==value):
                print(modify_name, ' found in directory')
                print('That name is in position', key)
                update_name = input('Enter what is the change to make')
                user_names[k] = update_name # updates the name in user_names dictionary
                user_directory[k] = update_name # updates in user_dictionary 
            break

        else:
            print('That name not found')


# Finds a contact and then removes it. I will use pop so that I can later track it.
def delete_user():
    search_name = input('Enter name')

    if (search_name in user_names.values()):
        print("Name found")
        to_remove = input('Do you want to proceed to delete that contact? Y/N..?')
        if (to_remove == 'Y'):
            for k, v in user_directory.items():
                for key, value in user_names.items():
                    print()
            print("Removing id", k)
            del user_directory[k]

    else:
        print('That contact does not exist')


# Menu items
while True:
    print('Pick an option from menu above')
    print('Options are 1-6, invalid selection will exit program')
    user_choice = int(input())  # used for user input for menu
    if (user_choice == 1):
        addUserUserIDToDict()
        print_directory()

    elif (user_choice == 2):
        modify_profile()

    elif (user_choice == 3):
        delete_user()

    elif (user_choice == 4):
        print_directory()

    elif (user_choice == 5):
        search_user()

    elif (user_choice == 6):
        print('Exit Program')
        break

    elif (user_choice < 1 or user_choice > 6):
        print('Wrong selection.Menu between 1 to 6')
        print('Exit Program')
        break

Моя первая проблема - я не могу напечатать полное значение ключа из user_names.Я использую заявление возврата там.Если я поменяю его на print (k, v), это будет работать.Однако, если я не использую return, я не могу использовать его в функции addToDict.Другая проблема заключается в том, что я не уверен, почему это происходит, когда я пытаюсь обновить имя или фамилию, он также обновляет другие записи.

Вот проблемы со времени выполнения

Issue1 : печать частичных данных, получаемых из функции определения имени и определения (** опции)

user_id74 ('first_name', 'sam') ** Не печатать фамилию

user_id15 ('last_name', 'jones', 'phone', '952') *** не печатает имя и адрес электронной почты

Issue2 : функция обновления from-def modify_profile () updateдругие записи

До изменения:

user_id85 ('last_name', 'rahman')

user_id24 ('last_name', 'jones')

Послеизменить:

user_id85 Январь *** Обратите внимание выше, как исчезла часть фамилии.

user_id24 ('last_name', 'jones')

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

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