Python - 嵌套字典与元组哈希对比?

1 投票
2 回答
1678 浏览
提问于 2025-04-16 09:41

我在想,使用嵌套字典和用元组做哈希在Python中各有什么优缺点呢?

这里的背景是,我在写一个小脚本,用来给会议的与会者分配“研讨会”。

每个研讨会都有几个属性(比如周、天、主题等等)。我们用其中四个属性来给每个与会者分配研讨会,也就是说,每个代表也会有周/天/主题等信息。

现在,我用一个嵌套字典来存储我的研讨会:

workshops = defaultdict(lambda: defaultdict(lambda:defaultdict(lambda:defaultdict(dict))))

with open(input_filename) as input_file:
    workshop_reader = csv.DictReader(input_file, dialect='excel')

    for row in workshop_reader:
        workshops[row['Week ']][row['Stream']][row['Strand']][row['Day']] = row

return workshops

然后我可以用这个数据结构来给每个与会者分配他们的研讨会。

问题是,后来我需要遍历每个研讨会,并给它们分配一个ID(这个ID存储在另一个系统里),这就需要一层一层地解开这个结构。

第一个问题是,有没有其他方法可以创建一个二级索引,用字符串(研讨会名称)作为键?也就是说,我还是会有四层的嵌套字典,但我也可以根据名称来查找单独的条目。

第二个问题是,如何用元组作为键来实现类似的效果?你觉得使用这种方法有什么优势吗?会不会更简洁,或者更容易使用?(这种一层层解开的过程有点麻烦,我觉得不太友好)。

或者你有没有推荐其他的数据结构,可能更好、更容易访问或操作的?

谢谢,
Victor

2 个回答

4

一般来说,如果你需要把字典嵌套在一起,最好用类来代替。嵌套字典在调试的时候会变得很复杂,不容易管理。而使用类的话,你可以区分不同类型的字典,这样就简单多了。:)

7
class Workshop(object):
  def __init__(self, week, stream, strand, day, name):
    self.week = week
    self.stream = stream
    self.day = day
    self.strand = strand
    self.name = name

...
for row in workshop_reader:
  workshops['name'] = Workshop(...)

这仅仅是在名字是工作坊的唯一属性的情况下才成立(也就是说,不能有名字重复的工作坊)。
另外,你也可以很方便地给每个工作坊对象在工作坊字典里分配一个ID。

撰写回答