2017-12-18 15 views
0

Ich habe bereits eine ähnliche Frage gestellt, aber ich habe nicht die richtige Antwort erhalten, vielleicht weil ich nicht sehr klar darüber war, wie ich mein Programm ausführen soll.Python: Hinzufügen zu einer Liste aus verschiedenen Funktionen

Ich schreibe ein einfaches Geschenk, das Programm hinzufügt, und ich möchte ein Geschenk zu einer Person hinzufügen, die in einem Wörterbuch in einer anderen Funktion ist.

def main(): 

    print("Select: ") 

    print("\n\n\t1. Gifts") 

    selection_1 = input() 

    if selection_1 == "1": 
     people_list() 
     return selection 

    else: 
     print("Type a number for selecting.") 
     main() 

def people_list(): 

    people = {"Elena":["book","candy","sweater"], 
      "Daria":["healthy food"], 
      "Petra and Rok":[], 
      "Nikola":["cheese"], 
      "Matija + Elena":["vacation"], 
      "Christian":["chocolate"]} 

    print ("""Select a person to show their gifts: 

     1. Elena 
     2. Daria 
     3. Petra and Rok 
     4. Nikola 
     5. Matija + Elena 
     6. Christian 

    """) 
    gifts(people) 


def gifts(people): 

    selection_2 = input() 

    if selection_2 == "1": 
     person = people["Elena"] 
     print(people["Elena"]) 
     manage_gifts(person, people) 
     return person 
    elif selection_2 == "2": 
     person = people["Daria"] 
     print(people["Daria"]) 
     manage_gifts(person, people) 
     return person 
    elif selection_2 == "3": 
     person = people["Petra and Rok"] 
     print(people["Petra and Rok"]) 
     manage_gifts(person, people) 
     return person 
    elif selection_2 == "4": 
     person = people["Nikola"] 
     print(people["Nikola"]) 
     manage_gifts(person, people) 
     return person 
    elif selection_2 == "5": 
     person = people["Matija + Elena"] 
     print(people["Matija + Elena"]) 
     manage_gifts(person, people) 
     return person 
    elif selection_2 == "6": 
     person = people["Christian"] 
     print(people["Christian"]) 
     manage_gifts(person, people) 
     return person 
    else: 
     print("Choose a person from the list!") 
     people_list() 
    return person 

def manage_gifts(person, people): 


    print(""" 
     1. Add gift""") 

    gift_option = input() 

    if gift_option == "1": 
     print("\nType the gift you would like to add?\n") 
     new_gift = input() 
     people[person].append(str(new_gift)) 
     print("Gift added: ", people[person]) 

main() 

Ich möchte erreichen, dass das neue Geschenk der "Person" hinzugefügt wird, die ich aus der Liste auswähle. Der Fehler, den ich bekommen ist:

Traceback (most recent call last): 
    File "E:/Python/Vaje_Book/Gifts.py", line 92, in <module> 
    main() 
    File "E:/Python/Vaje_Book/Gifts.py", line 10, in main 
    people_list() 
    File "E:/Python/Vaje_Book/Gifts.py", line 36, in people_list 
    gifts(people) 
    File "E:/Python/Vaje_Book/Gifts.py", line 46, in gifts 
    manage_gifts(person, people) 
    File "E:/Python/Vaje_Book/Gifts.py", line 89, in manage_gifts 
    people[person].append(str(new_gift)) 
TypeError: unhashable type: 'list' 

Ihnen sehr für Ihre Hilfe danken.

+0

Sie sollten den Wert in einigen der neuen Variablenliste und dann die new_gift anhängen und dann wieder aktualisieren. Wenn Sie das Wörterbuch übergeben möchten, verwenden Sie ** in Argumenten, in denen die Funktion manage_gift definiert ist. – babygame0ver

+0

Von dem, was ich sammeln kann, möchten Sie Dinge wie 'person = people [" Elena "]' in 'gifts()' zu nur 'person =" Elena "usw. ändern. Sie wollen' person' nur einen Namen haben damit du in 'people' nachschaust. Stattdessen gibt 'Leute ['Elena'] dir die Geschenke zurück, die sie bereits haben. – roganjosh

Antwort

0

In gifts(people):
wenn Sie person = people["Elena"] tun, dann ist person der Liste Typ.

Dann in manage_gifts(person, people):
wenn Sie people[person].append(str(new_gift)) tun, dann wird der Fehler TypeError: unhashable type: 'list' angehoben logisch, weil Person eine Liste ist. Es sollte eine Zeichenfolge sein.

Ich denke, dass in gifts(people), sollte man person = people["Elena"] durch person = "Elena" ersetzen. Und so weiter für die anderen Zuordnungen von person Variable.

Allerdings gibt es andere Fehler in diesem Code zu beheben:
- nicht main() innerhalb main()
rufen Sie - Rückkehr nichts in main()

0

Ich habe nicht genug rep zu kommentieren, aber Sie sollten wissen, dass das Aufrufen von main() am Ende Ihrer Hauptfunktion nicht gut ist. Python führt keine Tail-Call-Optimierung durch, so dass Sie irgendwann keinen Stack mehr haben und auf diese Weise abstürzen. Setzen Sie das Ganze stattdessen in eine While-Schleife. Z.B.

def main():

while True: 
    print("Select: ") 

    print("\n\n\t1. Gifts") 

    selection_1 = input() 

    if selection_1 == "1": 
     people_list() 
     return selection 

    else: 
     print("Type a number for selecting.") 
Verwandte Themen