Python基礎:字典(dict)與集合(set)


查找場景下與列表的性能對比 

  字典與集合之所以高效的原因是:內部結構都是一張哈希表。

  平均情況下插入、查找和刪除的時間復雜度為 O(1).

  假設有數量100,000的產品列表:

import time
id = [x for x in range(0, 100000)]
price = [x for x in range(200000, 300000)]
products = list(zip(id, price))
#products
# [(0, 200000), (1, 200001)....(99999, 299999)]

  要統計出總共有多少種不同的價格,分別用列表list與集合set來作為存儲的數據結構,來對比下性能。

  用列表作為數據結構:

# # 計算列表版本的時間

# list version
def find_unique_price_using_list(products):
    unique_price_list = []
    for _, price in products: # A
        if price not in unique_price_list: #B
            unique_price_list.append(price)
    return len(unique_price_list)

start_using_list = time.perf_counter()
find_unique_price_using_list(products)
end_using_list = time.perf_counter()
print("time elapse using list: {}".format(end_using_list - start_using_list))
#time elapse using list: 53.206719899999996

 

  用集合作為數據結構:

# # 計算集合版本的時間
# set version
def find_unique_price_using_set(products):
    unique_price_set = set()
    for _, price in products:
        unique_price_set.add(price)
    return len(unique_price_set)     

start_using_set = time.perf_counter()
find_unique_price_using_set(products)
end_using_set = time.perf_counter()
print("time elapse using set: {}".format(end_using_set - start_using_set))
#time elapse using set: 0.009022799999996778

 

  從結果可以看出,性能差異非常大,使用合適的數據結構非常重要。

Dict與Set基礎

  1. 集合不支持索引操作
  2. 判斷元素是否在dict/set中用 in 操作符
dict1 = {'a':1,'b':2}
print('a' in dict1) #True
print(1 in dict1)   #False
set1 = {'a','b','c'}
print(1 in set1)   #False
print('b' in set1) #True

  3.集合的pop()方法是隨機返回一個元素,並把集合中的該元素刪除

  4.集合與字典的排序

#字典排序
d = {'b': 1, 'a': 2, 'c': 10}
d_sorted_by_key = sorted(d.items(), key=lambda x: x[0]) # 根據字典鍵的升序排序
d_sorted_by_value = sorted(d.items(), key=lambda x: x[1]) # 根據字典值的升序排序
d_sorted_by_key
[('a', 2), ('b', 1), ('c', 10)]
d_sorted_by_value
[('b', 1), ('a', 2), ('c', 10)]

#集合排序
s = {3, 4, 2, 1}
sorted(s) # 對集合的元素進行升序排序
[1, 2, 3, 4]

 參考資料:

 極客時間《Python核心技術與實戰》專欄

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM