python解释器在调用导入函数后返回空白字典



我正在尝试学习python(使用VBA背景)。

我已经将以下函数导入到我的解释器中:

def shuffle(dict_in_question):  #takes a dictionary as an argument and shuffles it
    shuff_dict = {}
    n = len(dict_in_question.keys())
    for i in range(0, n):
        shuff_dict[i] = pick_item(dict_in_question)
    return shuff_dict

以下是我的翻译稿;

>>> stuff = {"a":"Dave", "b":"Ben", "c":"Harry"}
>>> stuff
{'a': 'Dave', 'c': 'Harry', 'b': 'Ben'}
>>> decky11.shuffle(stuff)
{0: 'Harry', 1: 'Dave', 2: 'Ben'}
>>> stuff
{}
>>> 

看起来字典被打乱了,但在那之后,字典就空了。为什么?或者,我用错了吗?

您也需要将其分配回stuff,因为您将返回一个新字典。

>>> stuff = decky11.shuffle(stuff)

Dogbert的答案解决了您眼前的问题,但请记住,字典没有顺序!没有"my_dict的第一个元素"这样的东西。(使用.keys()或.values()生成一个列表,它确实有顺序,但字典本身没有。)所以,谈论"打乱"字典并没有什么实际意义。

实际上,您在这里所做的只是将键从字母a、b、c重新映射到整数0、1、2。这些键的哈希值与您开始使用的键不同,因此它们以不同的顺序打印。但是你没有改变字典的顺序,因为字典一开始没有顺序。

根据你最终使用它的目的(你是否在密钥上迭代?),你可以做一些更直接的事情:

shufflekeys = random.shuffle(stuff.keys())
for key in shufflekeys:
    # do thing that requires order

顺便说一句,字典(又名哈希表)是一种非常聪明、非常有用的数据结构,如果你还不熟悉,我建议你深入学习。一个好的哈希函数(和非病态数据)会给你O(1)(即常数)的查找时间,这样你就可以像在一个十项词典中一样快速地检查一个键是否在一个一百万项的词典中!缺乏秩序是词典的一个关键特征,它可以实现这种速度。

最新更新