如果我在perl中有这条线
$cds_score{$score}{$id} = 1;
Run Code Online (Sandbox Code Playgroud)
其中cds得分是一个哈希,最好的python等价
cds_score = {}
cds_score[score] = id
Run Code Online (Sandbox Code Playgroud)
从更一般的意义上讲,我很困惑为什么我经常在perl的哈希末尾看到= 1.在python中,似乎更有意义的是使这些列表附加而不是像{NC} -> {$id} =1我在python中写的那样的dict NC.append(id).这个想法只是在perl中存储长列表作为哈希比作为数组更好,如果你试图查找任意成员?
所有值都是1(或者其他一些真理常量)的dict/hash 是一种标准的方法来模拟没有它们的语言中的集合,比如perl.(当然这是perl,它只是众多标准方法中的一种.)
Python 确实有集合,所以你可以使用它们.例如:
cds_score[score].add(id)
Run Code Online (Sandbox Code Playgroud)
但是,Python 没有自动多级/递归序列,因此如果您需要,则需要使用defaultdict或显式执行dict.setdefault:
cds_score.setdefault(score, set()).add(id)
Run Code Online (Sandbox Code Playgroud)
这个结构 - 集合的序列(或散列的哈希值,总是为1) - 有时称为"多指令",因为它是表示将单个键映射到0或更多值的字典的值,而不是0或1的值.这两种语言都有第三方模块,可以更直接地实现多分区,但是这两种语言都不需要它们,因为它本身就很容易实现.
你在这做什么:
cds_score[score] = id
Run Code Online (Sandbox Code Playgroud)
...不等同于perl代码; 你只存储id每个的最后一个score,而不是存储所有的.
最后:
在python中,使这些列表附加而不是dict似乎更有意义
不是.列表是一种模拟集合的方法,但它有一些重要的权衡.特别是,列表允许重复条目,并采用O(N)而不是O(1)时间进行搜索.这些权衡在perl和python中几乎完全相同,所以如果它在perl中不合适,那么它在python中也是不合适的.
如果您只保留一些值并且永远不会有重复项,请继续使用任何一种语言的列表.如果您可能会有大型集合,或者可能会出现多次相同的值,那么您需要一个真实的集合,使用任何一种语言(在perl中,您必须使用哈希伪造).