如果我在 perl 中有这行
$cds_score{$score}{$id} = 1;
其中 cds score 是一个散列,最好的 python 等价物是
cds_score = {}
cds_score[score] = id
从更一般的意义上讲,我很困惑为什么我经常在 perl 的散列末尾看到 =1。在 python 中,在 {NC} -> {$id} =1
的情况下,使这些列表附加而不是 dict 似乎更有意义,在 python 中我会写 NC。追加(ID)
。如果您要查找任意成员,这个想法是否只是在 perl 中将长列表存储为散列比存储为数组更好?
最佳答案
所有值都是 1
(或其他一些真实常量)的字典/散列是一种标准的方法来模拟没有集合的语言,比如 perl。 (当然这是 perl,它只是许多标准方法之一。)
Python 确实有sets ,所以你可以只使用它们。例如:
cds_score[score].add(id)
然而,Python 没有自动多级/递归指令,所以如果你想要那个,你需要用 defaultdict
明确地做到这一点。或 dict.setdefault
:
cds_score.setdefault(score, set()).add(id)
这种结构——集合字典(或哈希值始终为 1 的哈希值)——有时被称为“multidict”,因为它是表示将单个键映射到 0 个或多个值的字典的值,而不是 0 或 1 值。两种语言都有第三方模块可以更直接地实现 multidicts,但两种语言都不需要它们,因为您自己做起来非常简单。
你在这里做什么:
cds_score[score] = id
... 不等同于 perl 代码;您只存储每个 score
的最后一个 id
,而不是存储所有它们。
最后:
In python, it seems more sense to make these list appending instead of a dict
没有。列表是一种模拟集合的方法,但它有一些重要的权衡。特别是,列表允许重复条目,并且需要 O(N) 而不是 O(1) 的时间来搜索。这些权衡在 perl 和 python 中几乎相同,因此如果它在 perl 中不合适,那么它在 python 中也不合适。
如果您只保留一些值并且绝不会重复,请继续使用列表,无论哪种语言。如果您可能会拥有大型集合,或者可能会多次出现相同的值,那么您需要一个真实的集合,无论是哪种语言(在 perl 中,您必须使用散列来伪造)。
关于python - perl 中的多个哈希分配 - 转换为 python?为什么总是等于 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20480851/