Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >两者合并的最快方法:字典与列表

两者合并的最快方法:字典与列表
EN

Stack Overflow用户
提问于 2010-05-17 12:46:49
回答 3查看 271关注 0票数 1

我正在做一些索引,内存是足够的,但是CPU不够。所以我有一个很大的字典,然后是一个较小的字典,我要合并到更大的字典中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
big_dict = {"the" : {"1" : 1, "2" : 1, "3" : 1, "4" : 1, "5" : 1}}
smaller_dict = {"the" : {"6" : 1, "7" : 1}}
#after merging
resulting_dict = {"the" : {"1" : 1, "2" : 1, "3" : 1, "4" : 1, "5" : 1, "6" : 1, "7" : 1}}

我的问题是两个dict中的值,当我的优先级是使用尽可能多的内存来最大限度地利用我的CPU时,我应该使用dict(如上所示)还是list (如下所示)?

为了便于说明,使用列表将如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
big_dict = {"the" : [1, 2, 3, 4, 5]}
smaller_dict = {"the" : [6,7]}
#after merging
resulting_dict = {"the" : [1, 2, 3, 4, 5, 6, 7]}

附注:我之所以使用嵌套在字典中的字典而不是嵌套在字典中的集合,是因为JSON不允许我执行json.dumps,因为集合不是键/值对,它(就JSON库而言) {"a","series","of",“key”}

另外,在选择使用dict to a list之后,我将如何实现最有效的合并它们的CPU方法呢?

我很感谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-17 12:59:33

嗯。我首先选择字典方法,因为Python有一个最微调的字典实现,所以我非常怀疑使用列表字典能得到更好的结果。

至于合并字典,这应该足够了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for key, value in smaller_dict.iteritems():
    try:
        big_dict[key].update(value)
    except KeyError:
        big_dict[key] = dict(value)

我可能还会尝试将json.JSONEncoder子类化,以便能够序列化set类型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class SetEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, set):
            return dict.fromkeys(obj)
        return json.JSONEncoder.default(self, obj)

但是,后一种方法可能会在序列化方面增加一些开销,而且您还需要在反序列化时将这些字典转换为集合,方法是对json.JSONDecoder进行子类化,或者在额外的步骤中自己执行此操作。

票数 2
EN

Stack Overflow用户

发布于 2010-05-17 13:08:53

这真的取决于你想如何处理你内部列表/字典中的值。如果在添加新条目时,您希望内部列表只有唯一的值,那么对于大型列表,列表实现将会慢得多。它的规模大致为O(n),而不是字典的O(1)平均大小写。

如果你不关心那些内部列表中的倍数,那么它是一个更接近的东西。

我会像你一样使用字典。Python的字典非常高效(有人曾尝试用C语言为实时应用程序实现字典数据结构)。

至于不使用集合。调整序列化会更好(你会说,因为内存不是问题),并且让代码的速度关键部分尽可能简单。反序列化后,只需遍历列表并将其转换为集合:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
big_dict = {"the" : [1, 2, 3, 4, 5]} # imagine we got this from JSON

for key, value in big_dict: 
    big_dict[key] = set(value)

应该做这件事。除非您一直在序列化/反序列化整个索引,否则增加的预处理成本应该在足够多的请求上摊销,这一点无关紧要。

或者,您可以将编码器和解码器注册到JSON,这样您就可以自动执行此转换。然而,当问题如此小和受控制时,我通常不会费心。

因此,在基于字典的方法中,您可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for key, value in smaller_dict.items():
    if key in big_dict: 
        big_dict[key].update(value)
    else:
        big_dict[key] = value

如果希望big_dict仅复制字典,请在最后一行使用dict(value)而不是value。你也可以在最后一个循环中使用try:except KeyError,但是if...else要快一点(在我的机器上,YMMV)。

票数 2
EN

Stack Overflow用户

发布于 2010-05-17 13:24:45

对于这类东西,任何散列容器都比列表要好。

我仍然使用set而不是dict;如果您在使用json.dumps时遇到问题,您可以通过在转到serialize:dict.fromkeys(the_set, 1)时将集合转换为字典来解决这个问题,并将其提取出来:set(the_dict.keys())

这比注册JSON提供者要容易得多。

至于合并:merged_set = bigger_set.union(smaller_set)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2849101

复制
相关文章
Python的字典与散列表
说明: 本文是上一篇《Python的可散列对象》的续篇,两者都是对《Python大学实用教程》和《跟老齐学Python:轻松入门》有关字典内容的进阶知识。
老齐
2021/03/11
4.7K0
【说站】python update合并字典的方法
2、使用update(),为给定键提供的最后一个值将永远占上风。在循环中创建常规字典需要O(nm),而从最终字典中检索一个键需要O(1)。
很酷的站长
2022/11/24
5370
散列表结构 字典与集合
散列表(Hash Table)结构是字典(Dictionary)和集合(Set)的一种实现方式。散列算法的作用是尽可能快地在数据结构中找到一个值。在散列表上插入、删除和取用数据都非常快,但是对于查找操作来说却效率地下
py3study
2020/01/02
1K0
python-字典与列表学习
#字典练习 def print_dict(): contect_file = 'contect_list.txt' f = file(contect_file) #读取 contect_dic = {} for line in f.readlines(): name = line.split()[1] contect_dic[name] = line #是修改也是添加 #print contect_dic #调试输出 ''
py3study
2020/01/14
5630
Python3.9中合并字典的新方法
Python3.9,还在研发中,计划今年10月份发布,2月26日,研发团队发布了α版,其中有一个新功能,会关系到所有开发者,那就是两个操作符:|和|=,分别实现对字典的合并操作。
老齐
2020/05/15
1.4K0
Python3.9中合并字典的新方法
算法图解(五)|散列表与字典
我们之前介绍过简单查找和二分查找,简单查找是从头开始一个个查找,二分查找是在有序列表中按分而治之的思想进行查找,虽然二分查找已经很快速了,但是在有些情况下,还是不能达到人们的需求。
AI深度学习求索
2018/12/11
1.2K0
python中列表排序,字典排序,列表中的字典排序
key= lambda dict1:dict1[0] #dict1[0]表示按键,dict1[1]表示按值。
用户8346838
2021/03/10
9.1K0
Python中将字典转换为有序列表、无序列表的方法
说明:列表不可以转换为字典 1.转换后的列表为无序列表 a = {'a' : 1, 'b': 2, 'c' : 3} #字典中的key转换为列表 key_value = list(a.keys()
用户1214487
2018/04/13
3.5K0
Python中将字典转换为有序列表、无序列表的方法
Go 语言入门系列:列表与字典
前面的文章主要介绍了 Go 容器的数组和切片的基本概念以及使用。切片是 Go 中提供了一种灵活,功能强悍的内置类型("动态数组")。与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。本文将会介绍列表与字典在 Go 语言中相关的使用。
aoho求索
2021/07/16
7600
Python - 列表与字典相互转换
字符串转列表 s = 'abc' a = list(s) ['a','b','c'] 列表转为字符串 ''.join(a) 字符串转换为元组 s='abc' t = tuple(s) 元组转换为字符串 ''.join(t) 列表转换为元组 l = ['a','b','c'] tuple(l) 元组转换为列表 t = ('a','b','c') list(t) ['a','b','c'] 字典转换为列表 dic={'a':1,'b':2} dic.items() [('a',1),('b',2)] 列表转换为
py3study
2020/01/13
6220
python两个列表合并为字典,一个作为
两个列表合并为一个字典函数list_dic(list1,list2)可以直接复制拿走
py3study
2020/01/17
2.4K0
22.Python对列表与字典的迭代
在Python中只要是可迭代对象,都可以通过for循环进行遍历。列表与字典都是可迭代对象,所以都可以通过for进行遍历。 1.列表的遍历
用户4381798
2020/07/30
1.8K0
python 列表合并
collections.ChainMap from collections import ChainMap c = ChainMap(a,b) print(c['x']) # Outputs 1 (from a) print(c['y']) # Outputs 2 (from b) print(c['z']) # Outputs 3 (from a)
用户5760343
2019/09/25
1.1K0
python3 下列表与字典转换
在写爬虫的时候,经常需要处理cookie,requests库里的cookie是dict,但是headers['cookie']却是一个key=value的字符串。
黯然销魂掌
2018/09/27
5850
力扣 (LeetCode)-合并两个有序数组,字典,散列表
Github来源:力扣 (LeetCode)|刷题打卡 | 求星星 ✨ | 给个❤️关注,❤️点赞,❤️鼓励一下作者
达达前端
2021/03/22
1.3K0
力扣 (LeetCode)-合并两个有序数组,字典,散列表
在 Python 中合并列表的5种方法
当我开始学习 Python 的时候,并不知道它是多么的灵活和优雅。在阅读和编写了大量代码之后,我越来越喜欢 Python。因为即使是一个普通的操作也可以有许多不同的实现。合并列表是一个很好的例子,至少有5种方法可以做到这一点。本文将介绍它们,并展示在引擎盖下的技巧。
AI算法与图像处理
2021/04/21
4.1K0
在 Python 中合并列表的5种方法
列表,元祖,字典小记
1,建立列表,列表的元素可以包含任何数数据类型,可以是数字,字符串,列表,元组,字典,集合和布尔值
py3study
2020/01/19
7580
列表,元祖,字典小记
0428(字典,列表,循环)
该字典应包含键first_name 、last_name 、age 和city 。通过循环录入3个学生信息,存储到列表中, 并使用循环完成每个人具体信息的打印
py3study
2020/01/16
1.6K0
python列表、元组、字典
列表是由一序列特定顺序排列的元素组成的。可以把字符串,数字,字典等都可以任何东西加入到列表中,列表中的元素之间没有任何关系。列表也是自带下标的,默认也还是从0开始。列表常用方括号表示,即:[],元素用逗号隔开。
py3study
2020/01/15
1.2K0
Python - 从字典列表中删除字典
字典是python的一个非常常用的功能,用于根据用户需要在其中存储数据。另一个典型的过程涉及编辑或操作此数据。要成为一名高效且快速的程序员,您必须弄清楚如何从字典列表中删除字典。有许多技术可以从词典列表中删除字典,本文将介绍这些技术。
很酷的站长
2023/08/11
2060
Python - 从字典列表中删除字典

相似问题

将列表与列表字典进行比较的最快方法

315

合并n字典并在2.6上加值的最快方法

13

python基于键匹配合并字典的最快方法

30

比较列表与集合列表的最快方法

22

合并具有公共字段的列表的最快方法?

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文