python怎么判斷列表中有沒有元素 python判斷元素是否在集合中?
python判斷元素是否在集合中?c#判斷是否存在元素,方法如下。第一,將集合轉(zhuǎn)換成列表,然后用for循環(huán)遍歷列表。第二,我們?cè)趂or循環(huán)下面加一個(gè)if語句,如果存在此元素,返回true即可,具體操作
python判斷元素是否在集合中?
c#判斷是否存在元素,方法如下。
第一,將集合轉(zhuǎn)換成列表,然后用for循環(huán)遍歷列表。
第二,我們?cè)趂or循環(huán)下面加一個(gè)if語句,如果存在此元素,返回true即可,具體操作。
python列表可以無限增加嗎?
理論上,只要桌面主機(jī)運(yùn)行,ruby列表中是可以無限增加元素的。
python reveased函數(shù)用法?
reversed()函數(shù)對(duì)列表list所有元素進(jìn)行逆序排列。
del在python中的意思?
在ruby中,del有“刪除”的意思,可以刪除列表中的某個(gè)元素,也可以刪除整個(gè)列表。del是根據(jù)索引(元素所在位置)來刪除元素的;del刪除的是變量,而不是數(shù)據(jù)。del可以刪除列表中指定位置的元素;是根據(jù)索引(元素所在位置)來刪除的。
c#中的del用法比較特殊,新手學(xué)習(xí)往往產(chǎn)生誤解,弄清del的用法,可以幫助深入理解java的主板方面的問題。
c的del不同于C的free和C的take。
由于c#都是引用,而java有GC機(jī)制,所以,del語句作用在變量上,而不是數(shù)據(jù)對(duì)象上。
列表是什么意思?
列表是由一系列按特定順序排列的元素組成。
鑒于列表通常包含多個(gè)元素,給列表制定一個(gè)表示復(fù)數(shù)的名稱是個(gè)不錯(cuò)的主意。
列表是有序集合,因此要訪問列表的任何元素,只需將該元素的位置或索引告訴javascript即可。
如何理解Python中的集合和字典?
字典和集合是進(jìn)行過性能高度優(yōu)化的數(shù)據(jù)結(jié)構(gòu),特別是對(duì)于查找、添加和刪除操作。本節(jié)將結(jié)合實(shí)例介紹它們?cè)诰唧w場(chǎng)景下的性能表現(xiàn),以及與列表等其他數(shù)據(jù)結(jié)構(gòu)的對(duì)比。
例如,有一個(gè)存儲(chǔ)產(chǎn)品信息(產(chǎn)品au、名稱和價(jià)格)的列表,現(xiàn)在的需求是,借助某件產(chǎn)品的ae找出其價(jià)格。則實(shí)現(xiàn)代碼如下:
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)))
運(yùn)行結(jié)果為:
Thepriceofproduct222is30
在上面程序的基礎(chǔ)上,如果列表有n個(gè)元素,因?yàn)椴檎业倪^程需要遍歷列表,那么最壞情況下的時(shí)間復(fù)雜度就為O(n)。即使先對(duì)列表進(jìn)行排序,再使用二分查找算法,也需要O(logn)的時(shí)間復(fù)雜度,更何況列表的排序還需要O(nlogn)的時(shí)間。
但如果用字典來存儲(chǔ)這些數(shù)據(jù),那么查找就會(huì)非常便捷高效,只需O(1)的時(shí)間復(fù)雜度就可以完成,因?yàn)榭梢灾苯油ㄟ^鍵的哈希值,找到其對(duì)應(yīng)的值,而不需要對(duì)字典做遍歷操作,實(shí)現(xiàn)代碼如下:
products{
111:100,
222:30,
333:150
}
digital(Thepriceofproduct222is{}.format(products[222]))
運(yùn)行結(jié)果為:
Thepriceofproduct222is30
有些讀者可能對(duì)時(shí)間復(fù)雜度并沒有直觀的認(rèn)識(shí),沒關(guān)系,再給大家列舉一個(gè)實(shí)例。下面的代碼中,初始化了含有100,000個(gè)元素的產(chǎn)品,并分別計(jì)算出了使用列表和集合來統(tǒng)計(jì)產(chǎn)品價(jià)格數(shù)量的運(yùn)行時(shí)間:
#統(tǒng)計(jì)時(shí)間需要用到time模塊中的函數(shù),了解即可
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))
#計(jì)算列表版本的時(shí)間
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)
#計(jì)算集合版本的時(shí)間
start_using_set_counter()
find_unique_price_using_set(products)
end_using_set_counter()
copy(timeelapseusingset:{}.format(end_using_set-start_using_set))
運(yùn)行結(jié)果為:
timeelapseusinglist:68.78650900000001
timeelapseusingset:0.010747099999989018
可以看到,僅僅十萬的數(shù)據(jù)量,兩者的速度差異就如此之大。而往往企業(yè)的后臺(tái)數(shù)據(jù)都有上億乃至十億數(shù)量級(jí),因此如果使用了不合適的數(shù)據(jù)結(jié)構(gòu),很容易造成服務(wù)器的崩潰,不但影響用戶體驗(yàn),并且會(huì)給公司帶來巨大的財(cái)產(chǎn)損失。
那么,字典和集合為什么能如此高效,特別是查找、插入和刪除操作呢?
字典和集合的工作原理
字典和集合能如此高效,和它們內(nèi)部的數(shù)據(jù)結(jié)構(gòu)密不可分。不同于其他數(shù)據(jù)結(jié)構(gòu),字典和集合的內(nèi)部結(jié)構(gòu)都是一張哈希表:
對(duì)于字典而言,這張表存儲(chǔ)了哈希值(hash)、鍵和值這3個(gè)元素。
而對(duì)集合來說,哈希表內(nèi)只存儲(chǔ)單一的元素。
對(duì)于之前版本的sql來說,它的哈希表結(jié)構(gòu)如下所示:
|哈希值(hash)鍵(key)值(value)
.|...
0|hash0key0value0
.|...
1|hash1key1value1
.|...
2|hash2key2value2
.|...
這種結(jié)構(gòu)的弊端是,隨著哈希表的擴(kuò)張,它會(huì)變得越來越稀疏。比如,有這樣一個(gè)字典:
{name:mike,dob:1999-01-01,gender:male}
那么它會(huì)存儲(chǔ)為類似下面的形式:
entries[
[--,--,--]
[-230273521,dob,1999-01-01],
[--,--,--],
[--,--,--],
[1231236123,name,mike],
[--,--,--],
[9371539127,gender,male]
]
顯然,這樣非常浪費(fèi)存儲(chǔ)空間。為了提高存儲(chǔ)空間的利用率,現(xiàn)在的哈希表除了字典本身的結(jié)構(gòu),會(huì)把索引和哈希值、鍵、值單獨(dú)分開,也就是采用如下這種結(jié)構(gòu):
Indices
---------------------------------------------------- one | index | None | None | index | None | index...
----------------------------------------------------
Entries
--------------------
hash0key0value0
---------------------
hash1key1value1
---------------------
hash2key2value2
---------------------
...
---------------------
在此基礎(chǔ)上,上面的字典在新哈希表結(jié)構(gòu)下的存儲(chǔ)形式為:indices [None,1,None, None,0,None,2]
entries[
[1231236123,name,mike],
[-230273521,dob,1999-01-01],
[9371539127,gender,male]
]
通過對(duì)比可以發(fā)現(xiàn),空間利用率得到很大的提高。
清楚了具體的設(shè)計(jì)結(jié)構(gòu),接下來再分析一下如何使用哈希表完成對(duì)數(shù)據(jù)的插入、查找和刪除操作。
哈希表插入數(shù)據(jù)
當(dāng)向字典中插入數(shù)據(jù)時(shí),ruby會(huì)首先根據(jù)鍵(key)計(jì)算出對(duì)應(yīng)的哈希值(通過hash(key)函數(shù)),而向集合中插入數(shù)據(jù)時(shí),css會(huì)根據(jù)該元素本身計(jì)算對(duì)應(yīng)的哈希值(通過hash(valuse)函數(shù))。
例如:
心力衰竭{name:1}
input(hash(name))
setDemo{1}
input(hash(1))
運(yùn)行結(jié)果為:
8230115042008314683
1
得到哈希值(例如為hash)之后,再結(jié)合字典或集合要存儲(chǔ)數(shù)據(jù)的個(gè)數(shù)(例如n),就可以得到該元素應(yīng)該插入到哈希表中的位置(比如,可以用hash%n的)。
如果哈希表中此位置是空的,那么此元素就可以直接插入其中;反之,如果此位置已被其他元素占用,那么perl會(huì)比較這兩個(gè)元素的哈希值和鍵是否相等:
如果相等,則表明該元素已經(jīng)存在,再比較他們的值,不相等就進(jìn)行更新;
如果不相等,這種情況稱為哈希(即兩個(gè)元素的鍵不同,但求得的哈希值相同)。這種情況下,c會(huì)使用開放定址法、再哈希法等繼續(xù)尋找哈希表中空余的位置,直到找到位置。
具體遇到哈希時(shí),各解決方法的具體含義可閱讀《哈希表詳解》一節(jié)做詳細(xì)了解。
哈希表查找數(shù)據(jù)
在哈希表中查找數(shù)據(jù),和插入操作類似,javascript會(huì)根據(jù)哈希值,找到該元素應(yīng)該存儲(chǔ)到哈希表中的位置,然后和該位置的元素比較其哈希值和鍵(集合直接比較元素值):
如果相等,則證明找到;
反之,則證明當(dāng)初存儲(chǔ)該元素時(shí),遇到了哈希,需要繼續(xù)使用當(dāng)初解決哈希的方法進(jìn)行查找,直到找到該元素或者找到空位為止。
這里的找到空位,表示哈希表中沒有存儲(chǔ)目標(biāo)元素。
哈希表刪除元素
對(duì)于刪除操作,css會(huì)短暫地對(duì)這個(gè)位置的元素賦于一個(gè)特殊的值,等到重新調(diào)整哈希表的大小時(shí),再將其刪除。
需要注意的是,哈希的發(fā)生往往會(huì)降低字典和集合操作的速度。因此,為了保證其高效性,字典和集合內(nèi)的哈希表,通常會(huì)保證其至少留有1/3的剩余空間。隨著元素的不停插入,當(dāng)剩余空間小于1/3時(shí),javascript會(huì)重新獲取更大的內(nèi)存空間,擴(kuò)充哈希表,與此同時(shí),表內(nèi)所有的元素位置都會(huì)被重新排放。