Python:将用户输入作为列表添加到字典中

时间:2018-02-18 19:23:44

标签: python

我有以下脚本。我向用户询问类别,并且可以通过用户给出的几种不同方式对每个类别进行排序。 因此输出应该是这样的:

{'a': ['b', 'c'], 'd': ['e', 'f']}

但它来了:

{'a': ['b', 'c', 'e', 'f'], 'd': ['b', 'c', 'e', 'f']}

我认为这是因为我在每个类别中引用相同的列表。我真的不知道如何使它动态化,然后清除列表似乎也没有给出正确的结果。

有人能指出我正确的方向吗? 提前致谢

def user_settings():
    settings = {}
    sorteer = []
    while True:

        categorie = input('wat wordt de naam van de categorie: \n')
        if categorie == 'q':
            break
        while True:
            sorteren = input('waar wil je op sorteren: \n')
            if sorteren == 'q':
                break
            sorteer.append(sorteren)
            settings[categorie] = sorteer
    print(settings)

2 个答案:

答案 0 :(得分:0)

在python列表中是可变的,你正在使用 sorteer 列表来设置dict中的键。每次在列表中进行更改(添加或删除元素)时,当您使用相同的列表时,它会反映每个键。有关详细信息,请参阅:Does Python have an immutable list?

您可以将程序更改为:

   def user_settings():
    settings = {}
    while True:
        categorie = input('Enter category: \n')
        if categorie == 'q':
            break
        while True:
            sorteren = input('enter range: \n')
            if sorteren == 'q':
                break
            if categorie in settings: #for python2.X use if settings.has_key(categorie)
                settings[categorie].append(sorteren)
            else:
                settings[categorie]=[sorteren]
    print(settings)

user_settings()

输出: {'a': ['b', 'c'], 'd': ['e', 'f']}

答案 1 :(得分:0)

tl; dr 向下移动sorteer = []一行,以便它在while循环中

def user_settings():
    settings = {}
    while True:
        sorteer = []
        categorie = input('wat wordt de naam van de categorie: \n')
        if categorie == 'q':
            break
        while True:
            sorteren = input('waar wil je op sorteren: \n')
            if sorteren == 'q':
                break
            sorteer.append(sorteren)
            settings[categorie] = sorteer
    print(settings)

<强>说明: sorteer = []创建一个新列表。不幸的是,你只做过一次。这意味着你只有一个列表。不仅字典的所有值都具有相同的元素,而且它们是完全相同的对象:

>>> sorteer['a'] == sorteer['d']
True
>>> sorteer['a'] is sorteer['d']
True

sorteer.append(sorteren)不会创建列表的副本。因此,所有键都映射到您拥有的唯一列表,即您在开头创建的列表。

修复代码的最简单方法是每次启动while的新循环时创建新列表。