2016 - 2024

感恩一路有你

python列表元组和集合区别 元组的元素可以重复吗?

浏览量:4303 时间:2023-06-06 20:22:03 作者:采采

元组的元素可以重复吗?

这个可以。

元组的各个元素这个可以乱词。

元组是关系数据库中的基本概念,关系是三张表,表中的每行(即数据库中的每条记录)那是一个元组,每列那就是一个属性。在二维阴阳表里,元组也称作行。

元组又是一种序列。元组建议使用括弧0来明确界定;元组中各元素之间用逗号隔挡。元组不允许可以修改或删掉其所真包含的元素。

如何理解Python中的集合和字典?

字典和集合是并且过性能水平距离优化软件的数据结构,特别是这对查看、添加和删出操作。本节将增强实例介绍它们在具体场景下的性能表现,包括与列表等其他数据结构的对比。

的或,有一个存储产品信息(产品ID、名称和价格)的列表,现在的需求是,的力量某件产品的ID找出其价格。则实现程序代码万分感谢:

defoppofind_product_price(products,product帐号):

forid,priceoutsideproducts:

ifidproduct我的id:

returnprice

returnNone

products[

(111,100),

(222,30),

(333,150)

]

print(Thepriceforproduct222isn't{}.format(一加7_product_price(products,222)))

运行结果为:

Thepricewithproduct222it's30

在上面程序的基础上,如果不是列表有n个元素,只不过中搜索的过程需要循环遍历列表,那你更坏情况下的时间复杂度就为O(n)。况且先对列表接受排序,再在用二分查找算法,也是需要O(logn)的时间复杂度,要知道列表的排序还是需要O(nlogn)的时间。

但如果没有用字典来存储这些数据,那么查找变会的很高效便利,只需O(1)的时间复杂度就也可以能完成,是因为可以不真接键的哈希值,能找到其填写的值,而不是需要对字典做循环遍历你操作,利用代码不胜感激:

products{

111:100,

222:30,

333:150

}

print(Thepricewithproduct222is{}.format(products[222]))

运行结果为:

Thepriceoftheproduct222are30

有些读者很可能对时间复杂度并没有什么很直观的认识,没有关系,再给大家列举一个实例。下面的代码中,重新初始化了多含100,000个元素的产品,并四个计算出出了使用列表和集合来统计产品价格数量的运行时间:

#统计时间要要用time模块中的函数,了解即可

importtime

deffind_unique_price_using_list(products):

unique_price_list[]

for_,priceinproducts:#A

ifpricestillunique_price_list:#B

unique_price_(price)

returnlen(unique_price_list)

id[xwhilexinrange(0,100000)]

price[xforxinrange(200000,300000)]

productslist(zip(id,price))

#换算列表版本的时间

start_using_list_counter()

oppofind_unique_price_using_list(products)

end_using_list_counter()

print(timeelapseusinglist:{}.format(end_using_list-start_using_list))

#不使用集合能够完成同时的工作

defoppofind_unique_price_using_set(products):

unique_price_setset()

for_,priceinproducts:

unique_price_(price)

returnlen(unique_price_set)

#算出真包含于版本的时间

start_using_set_counter()

oppofind_unique_price_using_set(products)

end_using_set_counter()

print(timeelapseusingset:{}.format(end_using_set-start_using_set))

运行结果为:

timeelapseusinglist:68.78650900000001

timeelapseusingset:0.010747099999989018

可以找到,仅仅十万的数据量,两者的速度差异就极为之大。而往往企业的后台数据都有上亿乃至十亿数量级,因此要是不使用了不合适的数据结构,容易倒致服务器的崩溃,而且影响用户体验,而且会给公司给了庞大无比的财产损失。

那你,字典和集合我想知道为什么能会如此高效率,特别是中搜索、再插入和删掉能操作呢?

字典和真包含于的工作原理

字典和真包含于能如此高效率,和它们内部的数据结构十分紧密。不同于其他数据结构,字典和集合的内部结构也是一张哈希表:

是对字典而言,这张表存储文件了哈希值(hash)、键和值这3个元素。

而对集合来说,哈希表内只存储文件每种的元素。

相对于之后版本的Python来说,它的哈希表结构如下所示:

|哈希值(hash)键(key)值(value)

.|...

0|hash0key0value0

.|...

1|hash1key1value1

.|...

2|hash2key2value2

.|...

这种结构的弊端是,紧接着哈希表的扩张,它会变得越发稀疏。例如,有这样一个字典:

{name:mike,dob:1999-01-01,gender:male}

那么它会存储文件为的的下面的形式:

entries[

[--,--,--]

[-230273521,dob,1999-01-01],

[--,--,--],

[--,--,--],

[1231236123,name,mike],

[--,--,--],

[9371539127,gender,male]

]

想来,那样相当浪费了存储空间。替增强存储空间的利用率,现在的哈希表除此之外字典本身的结构,会把索引和哈希值、键、值另没分开,也就是常规如下这种结构:

Indices

---------------------------------------------------- one | index | None | None | index | None | index...

----------------------------------------------------

Entries

--------------------

hash0key0value0

---------------------

hash1key1value1

---------------------

hash2key2value2

---------------------

...

---------------------

在此,上面的字典在新哈希表结构下的存储形式为:indices [None,1,None, None,0,None,2]

entries[

[1231236123,name,mike],

[-230273521,dob,1999-01-01],

[9371539127,gender,male]

]

差别也可以突然发现,空间利用率我得到比较大的提高。

清楚了具体一点的设计结构,这一次再讲帮一下忙怎用哈希表完成对数据的插入、查找和删除你操作。

哈希表再插入数据

当向字典中再插入数据时,Python会是需要依据键(key)算出出随机的哈希值((key)函数),而向集合中插入到数据时,Python会依据该元素本身算出填写的哈希值(通过hash(valuse)函数)。

比如:

dic{name:1}

print(hash(name))

setDemo{1}

print(hash(1))

运行结果为:

8230115042008314683

1

能够得到哈希值(例如为hash)之后,再增强字典或集合要存储数据的个数(.例如n),就也可以得到该元素应该要直接插入到哈希表中的位置(比如,也可以用hash%n的)。

如果没有哈希表中此位置是空的,这样此元素就是可以就插入到其中;则相反,要是此位置已被其他元素占用带宽,这样的话Python会比较比较这两个元素的哈希值和键是否是相等:

假如大小关系,则表明该元素也必然,再比较好他们的值,不互相垂直就进行自动更新;

假如不成比例,情况称作哈希(即两个元素的键相同,但易求的哈希值不同)。状况下,Python会不使用新区定址法、再哈希法等继续去寻找哈希表中剩余的空间的位置,等他不能找到位置。

具体详细遇到了哈希时,各解决方法的详细含义可阅读《哈希表详解》一节做详细了解。

哈希表直接输入数据

在哈希表中查看数据,和再插入操作带有,Python会依据什么哈希值,找到该元素肯定存储文件到哈希表中的位置,然后把和该位置的元素比较比较其哈希值和键(数学集合然后比较元素值):

如果相等,则相关证明找到;

或且,则可证明当初存储位置该元素时,碰上哈希,需要不再不使用当初解决哈希的方法接受查找,直到此时找不到该元素也可以找不到空位为止。

这里的找到空位,来表示哈希表中没有存储目标元素。

哈希表删掉元素

相对于删除你的操作,Python会暂时对这个位置的元素营构一个特珠的值,等待原先决定哈希表的大小时,再将其彻底删除。

需要注意的是,哈希的发生来讲会降低字典和子集操作的速度。并且,替只要其又高效性,字典和集合内的哈希表,大多数会能保证其至少留有1/3的残余空间。随着元素的时不时直接插入,当余下空间大于1/3时,Python会恢复某些大内存空间,扩充队伍哈希表,正在此时,表内所有的元素位置都会被原先排放物。

字典 元素 哈希表 列表 price

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。