【发布时间】:2014-07-02 09:48:41
【问题描述】:
基本上,我“理解”使用其他容器作为键的歧义。 - 你比较参考还是比较其中的值(以及多深)。
你不能只专门化一个列表并制作一个自定义比较/哈希运算符吗?正如我在我的应用程序中所知道的,我希望通过字符串的值(当然还有相对顺序)来比较字符串列表。
那么我将如何为这类列表编写自定义哈希?或者以另一种方式 - 我将如何对列表进行字符串化而不导致您从引入分隔符(该分隔符可能是字符串的一部分)中得到的歧义?!
关于这个问题:https://wiki.python.org/moin/DictionaryKeys
那里直接说不能使用列表;
也就是说,为什么列表不能用作字典键的简单答案是列表不提供有效的 hash 方法。当然,显而易见的问题是,“为什么不呢?”
所以我写这篇文章是为了质疑是否有办法使列表可散列;以及如何制作令人满意的 Hash 方法。
作为我为什么想要这个的一个例子,请看下面的代码:
namelist = sorted(["Jan", "Frank", "Kim"])
commonTrait = newTraits()
traitdict = {}
traitdict[namelist] = commonTrait;
//later I wish to retrieve it:
trait = traitdict[sorted(["Jan", "Frank", "Kim"])]
在这种直接使用中,我认为“列表的排序”并不重要(排序只是在上面的代码中完成,以使列表在包含相同内容时始终相等)。
【问题讨论】:
-
我认为代码示例将有助于阐明您的需求。
-
您可以使用(嵌套)元组作为键很好。问题在于可变性。钥匙也仍然只是一个参考;如果您可以使用对同一对象的另一个引用来修改内容,那么突然之间就不可能在哈希表结构中再次找到相同的键。突变破坏散列表。
-
就目前而言,目前还不清楚您到底要做什么,到目前为止您已经尝试过什么以及遇到了什么问题。
-
这类问题由我来决定使用哪种语言。首先创建一些东西然后注意到该语言没有你想要的结构是不是有点傻?我首先对其进行评估-您如何执行常见任务。 @MartijnPieters 嗯,所以 python 根本不复制密钥? - 但是两个内容相同但分别构造的列表会指向相同的值吗?
-
这似乎是一个 XY 问题。你想通过使用字符串列表作为字典键来实现什么,对列表的内容有什么进一步的限制吗?
标签: python list dictionary stringification