使用for循环打印字典时出现TypeError

时间:2016-06-10 13:21:29

标签: python python-3.x

这是一个(家庭作业)问题,我现在已经工作了几个小时。在我被要求打印下面代码中指定的字典内容之前,一切顺利:

# 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-loop和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

我的意思是,它显然是在抱怨字符串,但为什么上面的示例代码有效呢?

2 个答案:

答案 0 :(得分:0)

sorted返回一个列表,因此jarjestetty_sanakirja是列表,而不是字典。列表必须用整数索引,不像dicts可以用任何可哈希的索引编制索引。

尝试索引传入的字典。

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

答案 1 :(得分:0)

sorted返回一个列表,因此您需要使用整数来访问它,而不像您可以使用键值访问的dict