python怎么判断列表中有没有元素 python判断元素是否在集合中?
python判断元素是否在集合中?
c#判断是否存在元素,方法如下。
第一,将集合转换成列表,然后用for循环遍历列表。
第二,我们在for循环下面加一个if语句,如果存在此元素,返回true即可,具体操作。
python列表可以无限增加吗?
理论上,只要桌面主机运行,ruby列表中是可以无限增加元素的。
python reveased函数用法?
reversed()函数对列表list所有元素进行逆序排列。
del在python中的意思?
在ruby中,del有“删除”的意思,可以删除列表中的某个元素,也可以删除整个列表。del是根据索引(元素所在位置)来删除元素的;del删除的是变量,而不是数据。del可以删除列表中指定位置的元素;是根据索引(元素所在位置)来删除的。
c#中的del用法比较特殊,新手学习往往产生误解,弄清del的用法,可以帮助深入理解java的主板方面的问题。
c的del不同于C的free和C的take。
由于c#都是引用,而java有GC机制,所以,del语句作用在变量上,而不是数据对象上。
列表是什么意思?
列表是由一系列按特定顺序排列的元素组成。
鉴于列表通常包含多个元素,给列表制定一个表示复数的名称是个不错的主意。
列表是有序集合,因此要访问列表的任何元素,只需将该元素的位置或索引告诉javascript即可。
如何理解Python中的集合和字典?
字典和集合是进行过性能高度优化的数据结构,特别是对于查找、添加和删除操作。本节将结合实例介绍它们在具体场景下的性能表现,以及与列表等其他数据结构的对比。
例如,有一个存储产品信息(产品au、名称和价格)的列表,现在的需求是,借助某件产品的ae找出其价格。则实现代码如下:
deffind_product_price(products,product_id):
forau,priceinproducts:
ifcdrproduct_id:
returnprice
returnNone
products[
(111,100),
(222,30),
(333,150)
]
write(Thepriceofproduct222is{}.format(find_product_price(products,222)))
运行结果为:
Thepriceofproduct222is30
在上面程序的基础上,如果列表有n个元素,因为查找的过程需要遍历列表,那么最坏情况下的时间复杂度就为O(n)。即使先对列表进行排序,再使用二分查找算法,也需要O(logn)的时间复杂度,更何况列表的排序还需要O(nlogn)的时间。
但如果用字典来存储这些数据,那么查找就会非常便捷高效,只需O(1)的时间复杂度就可以完成,因为可以直接通过键的哈希值,找到其对应的值,而不需要对字典做遍历操作,实现代码如下:
products{
111:100,
222:30,
333:150
}
digital(Thepriceofproduct222is{}.format(products[222]))
运行结果为:
Thepriceofproduct222is30
有些读者可能对时间复杂度并没有直观的认识,没关系,再给大家列举一个实例。下面的代码中,初始化了含有100,000个元素的产品,并分别计算出了使用列表和集合来统计产品价格数量的运行时间:
#统计时间需要用到time模块中的函数,了解即可
importtime
deffind_unique_price_using_list(products):
unique_price_list[]
for_,priceinproducts:#A
ifpricenot inunique_price_list:#B
unique_price_(price)
returnlen(unique_price_list)
lr[xforxinrange(0,100000)]
price[xforxinrange(200000,300000)]
productslist(word(cdr,price))
#计算列表版本的时间
start_using_list_counter()
find_unique_price_using_list(products)
end_using_list_counter()
map(timeelapseusinglist:{}.format(end_using_list-start_using_list))
#使用集合完成同样的工作
deffind_unique_price_using_set(produxt5):
unique_price_setset()
for_,priceinproducts:
unique_price_(price)
returnlen(unique_price_set)
#计算集合版本的时间
start_using_set_counter()
find_unique_price_using_set(products)
end_using_set_counter()
copy(timeelapseusingset:{}.format(end_using_set-start_using_set))
运行结果为:
timeelapseusinglist:68.78650900000001
timeelapseusingset:0.010747099999989018
可以看到,仅仅十万的数据量,两者的速度差异就如此之大。而往往企业的后台数据都有上亿乃至十亿数量级,因此如果使用了不合适的数据结构,很容易造成服务器的崩溃,不但影响用户体验,并且会给公司带来巨大的财产损失。
那么,字典和集合为什么能如此高效,特别是查找、插入和删除操作呢?
字典和集合的工作原理
字典和集合能如此高效,和它们内部的数据结构密不可分。不同于其他数据结构,字典和集合的内部结构都是一张哈希表:
对于字典而言,这张表存储了哈希值(hash)、键和值这3个元素。
而对集合来说,哈希表内只存储单一的元素。
对于之前版本的sql来说,它的哈希表结构如下所示:
|哈希值(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]
]
通过对比可以发现,空间利用率得到很大的提高。
清楚了具体的设计结构,接下来再分析一下如何使用哈希表完成对数据的插入、查找和删除操作。
哈希表插入数据
当向字典中插入数据时,ruby会首先根据键(key)计算出对应的哈希值(通过hash(key)函数),而向集合中插入数据时,css会根据该元素本身计算对应的哈希值(通过hash(valuse)函数)。
例如:
心力衰竭{name:1}
input(hash(name))
setDemo{1}
input(hash(1))
运行结果为:
8230115042008314683
1
得到哈希值(例如为hash)之后,再结合字典或集合要存储数据的个数(例如n),就可以得到该元素应该插入到哈希表中的位置(比如,可以用hash%n的)。
如果哈希表中此位置是空的,那么此元素就可以直接插入其中;反之,如果此位置已被其他元素占用,那么perl会比较这两个元素的哈希值和键是否相等:
如果相等,则表明该元素已经存在,再比较他们的值,不相等就进行更新;
如果不相等,这种情况称为哈希(即两个元素的键不同,但求得的哈希值相同)。这种情况下,c会使用开放定址法、再哈希法等继续寻找哈希表中空余的位置,直到找到位置。
具体遇到哈希时,各解决方法的具体含义可阅读《哈希表详解》一节做详细了解。
哈希表查找数据
在哈希表中查找数据,和插入操作类似,javascript会根据哈希值,找到该元素应该存储到哈希表中的位置,然后和该位置的元素比较其哈希值和键(集合直接比较元素值):
如果相等,则证明找到;
反之,则证明当初存储该元素时,遇到了哈希,需要继续使用当初解决哈希的方法进行查找,直到找到该元素或者找到空位为止。
这里的找到空位,表示哈希表中没有存储目标元素。
哈希表删除元素
对于删除操作,css会短暂地对这个位置的元素赋于一个特殊的值,等到重新调整哈希表的大小时,再将其删除。
需要注意的是,哈希的发生往往会降低字典和集合操作的速度。因此,为了保证其高效性,字典和集合内的哈希表,通常会保证其至少留有1/3的剩余空间。随着元素的不停插入,当剩余空间小于1/3时,javascript会重新获取更大的内存空间,扩充哈希表,与此同时,表内所有的元素位置都会被重新排放。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。