gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:09:15 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com