python在大字典中使用key in dict.keys()的性能问题

13 投票
5 回答
23416 浏览
提问于 2025-04-16 10:13

我在想,大家能不能给我一些建议,让我的代码性能更好。

我有一组循环,主要是检查一个字典里是否有某个键。如果这个键存在,就把值加到对应的列表里;如果不存在,就为这个键新建一个列表。

dict={}
for value in value_list:
   if value.key in dict.keys():
      temp_list = dict[value.key]
      temp_list.append(value.val)
      dict[value.key] = temp_list
   else:
      dict[value.key] = [value.val]

现在这段代码运行得还不错,但随着字典里的内容越来越多,检查键的那部分代码就变得越来越麻烦了。

有没有更好的方法来实现这个功能呢?

谢谢,

Mike

5 个回答

4

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。比如说,当你在写代码时,可能会发现某个功能没有按照预期工作。这时候,你可能会去网上查找解决办法,比如在StackOverflow上提问或寻找答案。

在这些讨论中,大家会分享他们的经验和解决方案。有些人可能会提供代码示例,帮助你更好地理解问题所在。通过这些交流,你可以学到很多实用的技巧和知识,逐步提高自己的编程能力。

总之,编程的过程中遇到问题是很正常的,关键是要善于利用网络资源,向其他人请教,找到解决方案。

your_dict.setdefault(value.key, []).append(value.val)
4

使用 collections.defaultdict,这可以简化为

d = collections.defaultdict(list)
for value in value_list:
    d[value.key].append(value.val)
50

不要这样做:

value.key in dict.keys()

在Python 2中,这样做会创建一个包含所有键的列表。随着字典变大,这样的操作会变得越来越耗费资源,而且在这个列表中查找键的时间复杂度是O(n),这就失去了使用字典的意义。

相反,应该这样做:

value.key in dict

这样做不会创建一个临时的列表,而是通过哈希表直接查找键,而不是线性搜索。

setdefault,在其他地方提到过,是更简洁的做法,但理解上面的内容非常重要。

撰写回答