python - perl 中的多个哈希分配 - 转换为 python?为什么总是等于 1?

标签 python perl

如果我在 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/

相关文章:

python - 将多个文件从一台主机传输到另一台主机

regex - Perl正则表达式从带括号的字符串中提取数字

perl - 如何在 Perl 中获取文件名和行号?

linux - 将文件移动到另一个文件夹,包括文件名中的创建日期

perl - 如何 "map"在 3 个值之间?

python - python的pip支持http认证吗?

python - 如何将 TensorArray 提供给 TensorFlow session

perl - 如何包装 require 和 use?

python - 使用 python setuptools 从本地目录安装依赖项

python - Numpy 删除子矩阵