python列表、集合、字典转换要点以及查找速度区别,如何在大规模数据中实现快速查找
1. list与set的区别与优缺点:
循环速度: list最适合做固定长度的遍历,而且有顺序。set是无序的,list转换为set会乱序,若用set给list去重,转化为list时须用原list的index排序:new_list.sort(key=old_list.index)。所以这种循环尽量用list
查询速度: set > list, set查询的key都是hash过的,所以速度最快,list不适合用来做查询
增删速度: set > list, list的append操作尽量少做,因为会涉及重新分配地址的问题,set只需要增长指针链表
空间上: 由于list默认预留的空间会随着append指数级的变大,所以空间上也是set
2. dict list set tuple转化:
set、list、tuple 三种类型可以直接进行转化
将dict转为set、list、tuple ,值只转换了key
若将set、list、tuple 转为字典,必须set、tuple、list里面的元素必须是元组(列表),元组(列表)中的元素必须是2个,才能转为字典
eg:print(dict({(1, 2), (3, 4)})) ==== {1: 2, 3: 4}
3. list查找时间复杂度:O(n),set和dict查找时间复杂度:O(1) or O(logn)
查找效率:set>dict>list
单次查询中:list 就是O(n)的;而set做了去重,本质应该一颗红黑树(猜测,STL就是红黑树),复杂度O(logn);dict类似对key进行了hash,然后再对hash生成一个红黑树进行查找,其查找复杂其实是O(logn)。O(1)只是理想的实现,实际上很多hash的实现是进行了离散化的。dict比set多了一步hash的过程,比set慢,不过差别不大。
因此,如果是要频繁的查找,请使用set或dict。
因此,可以得出:根据某特定值查找几十万条数据的列表,遍历列表效率极低,可根据数据共同特征进行分类,即特征为key、分类后数据list为value,构建字典,根据key得到待遍历列表,缩小遍历范围,提升查找效率。
或者更简洁的说:为数据构建索引
参考文献:
python中,list和set在速度上有差异吗? - 知乎 (zhihu.com)
Python 中list ,set,dict的大规模查找效率_python数据类型查询效率-CSDN博客
python中set、list、tuple、dict相互转化_tuple,dict,list之间能否相互转换?请举例说明-CSDN博客