2016-06-10 69 views
0

這是一個(作業)問題,我一直在努力幾個小時。它是一切正常,直到我被要求打印在下面的代碼指定的詞典的內容:使用for-loop打印字典時出現TypeError

# Practicing the use of dict in python by writing a simple Finnish-Spanish 
# dictionary and a few operations that can be performed on said dictionary. 
# The keys in the dictionary are in Finnish. 


def print_dictionary(suomi_espanja): 
    """ 
    A function that prints a sorted (by key) dictionary. We are supposed to 
    use the sorted()-function in sorting the keys. 

    :param suomi_espanja: The dictionary to be printed 
    :return: 
    """ 
    jarjestetty_sanakirja = sorted(suomi_espanja) 
    for sana in jarjestetty_sanakirja: 
     print("{:s} {:s}".format(sana, jarjestetty_sanakirja[sana])) 


def alternate_print_dictionary(suomi_espanja): 
    """ 
    A function that prints a sorted (by key) dictionary. We are supposed to 
    use the sorted()-function in sorting the keys. This alternate version is 
    for testing whether the range()-function works for us in this case 
    (turns out it doesn't, no surprise there since this is a dict, not a list). 

    :param suomi_espanja: The dictionary to be printed 
    :return: 
    """ 
    jarjestetty_sanakirja = sorted(suomi_espanja) 
    for i in range(len(jarjestetty_sanakirja)): 
     print("{:d} {:s}".format(i, jarjestetty_sanakirja[i])) 


def translate_word(suomi_espanja): 
    """ 
    A function that translates a single word into Spanish 
    :param suomi_espanja: 
    :return: 
    """ 
    sana = input("Syötä käännettävä sana: ") 
    if sana in suomi_espanja: 
     print(sana, "espanjaksi on", suomi_espanja[sana]) 
    else: 
     print("Sanaa", sana, "ei löydy sanakirjasta.") 


def add_word(suomi_espanja): 
    """ 
    A function that adds words to the dictionary. 

    :param suomi_espanja: The dictionary specified in main() 
    :return: - 
    """ 
    sana = input("Syötä lisättävä sana suomeksi: ") 
    kaannos = input("Syötä lisättävä sana espanjaksi: ") 
    suomi_espanja[sana] = kaannos 


def remove_word(suomi_espanja): 
    """ 
    A function that removes a word from the dictionary 

    :param suomi_espanja: The dictionary in question 
    :return: - 
    """ 
    sana = input("Syötä poistettava sana suomeksi: ") 
    if sana not in suomi_espanja: 
     print("Sanaa {:s} ei löydy sanakirjasta".format(sana)) 
    else: 
     del suomi_espanja[sana] 


def translate_sentence(suomi_espanja): 
    """ 
    A function that translates an entire sentence (badly) based on the words 
    found in the dictionary 

    :param suomi_espanja: The dictionary 
    :return: - 
    """ 
    # Under construction 
    sana = input("Syötä käännettävä teksti suomeksi: ") 
    print("Teksti sanakirjan varassa käännettynä:") 
    print("Sanaa", sana, "ei löydy sanakirjasta.") 


def main_menu(suomi_espanja): 
    """ 
    A function containing the main menu for our dictionary program 

    :param suomi_espanja: Our dictioanry 
    :return: - 
    """ 

    # A menu for handling the dictionary 
    while True: 
     # Choosing what to do 
     komento = input("[S]ana/[L]isää/[P]oista/[T]ulosta/[K]äännä/[Q]uit: ") 
     komento = komento.upper() 
     # Translating a single word already in the dictionary 
     if komento == "S": 
      translate_word(suomi_espanja) 
     # Adding new words to the dictionary 
     elif komento == "L": 
      add_word(suomi_espanja) 
     # Removing words from the dictionary 
     elif komento == "P": 
      remove_word(suomi_espanja) 
     # Printing the dictionary sorted alphabetically based on the (Finnish) 
     # keys 
     elif komento == "T": 
      print_dictionary(suomi_espanja) 
     # Translating an entire sentence based on the words in the 
     # dictionary (under construction) 
     elif komento == "K": 
      translate_sentence(suomi_espanja) 
     # Quitting the program 
     elif komento == "Q": 
      print("Adios!") 
      return 
     # Erroneous input by the user 
     else: 
      print("Virheellinen komento, syötä joko S, L, P, T, K tai Q!") 


def main(): 
    # Our dictionary 
    suomi_espanja = {"moi": "hola", "kiitos": "gracias", "ranta": "playa"} 
    # A menu for handling the dictionary 
    main_menu(suomi_espanja) 


main() 

當我運行此代碼,然後按「T」來打印按字母順序排列的按鍵和相應的值,我得到以下錯誤:

"C:\Program Files (x86)\Python35-32\python.exe" D:/.../5.1.1(sanakirja_turistille).py 
[S]ana/[L]isää/[P]oista/[T]ulosta/[K]äännä/[Q]uit: t 
Traceback (most recent call last): 
    File "D:/.../5.1.1(sanakirja_turistille).py", line 134, in <module> 
    main() 
    File "D:/.../5.1.1(sanakirja_turistille).py", line 131, in main 
    main_menu(suomi_espanja) 
    File "D:/.../5.1.1(sanakirja_turistille).py", line 113, in main_menu 
    print_dictionary(suomi_espanja) 
    File "D:/.../5.1.1(sanakirja_turistille).py", line 16, in print_dictionary 
    print("{:s} {:s}".format(sana, jarjestetty_sanakirja[sana])) 
TypeError: list indices must be integers or slices, not str 

綜觀給我們(下)課程講義一個例子,最後的印刷指令應該工作,但它給了我一個TypeError。我已經在print_dictionary()函數中寫入了for循環和print命令,就像它們在示例中一樣,所以我不知道我在做什麼錯誤。

>>> for nimi in puhelinluettelo: 
... print(nimi) 
... 
Kemisti Kalle 
Fyysikko Tiina 
Teekkari Teemu 
Rakentaja Niina 
>>> for nimi in puhelinluettelo: 
... print("{:16s} {:12s}".format(nimi, puhelinluettelo[nimi])) 
... 
Kemisti Kalle 041-56789 
Fyysikko Tiina 045-234567 
Teekkari Teemu 050-12345 
Rakentaja Niina 0400-123 

我的意思是,這顯然是在抱怨字符串,但爲什麼上面的示例代碼工作?

回答

0

sorted返回一個列表,所以jarjestetty_sanakirja是一個列表,而不是一個字典。列表必須用整數索引,不像可以用任何可哈希索引的字典。

嘗試索引傳入的字典。

jarjestetty_sanakirja = sorted(suomi_espanja) 
for sana in jarjestetty_sanakirja: 
    print("{:s} {:s}".format(sana, suomi_espanja[sana])) 
+0

這是它的字典返回一個列表。謝謝。 – TheSodesa

0

sorted所以你需要一個整數訪問它不像你可以用鍵值訪問