Python基础数据结构
程序员文章站
2024-01-27 14:26:46
...
列表(list)
列表本身是动态的数据结构,每次会提前申请一部分空间,直到用完以后再重新申请,而不是每次用多少申请多少,类似与C#中的StringBuilder
适用于数据或数量是可变的场景
元组(tuple)
元组本身是静态结构,每次定义后就不可再变,每次变化相当于重新申请一个新的元组,特性类似于C#中的string。
适用于存储的数据和变量不变的场景。
字典(dict)
字典本身是一个键值对结构,可以动态申请,Key的存储是基于hash函数,因此等值查找的时间复杂度可以到O(1)。
集合(set)
类似字典也是基于hash函数,不过只是一个集合,而没有键值对,集合是不能有重复值的,因此可以用于去重(sql distinct),这个的效率比列表高不少,下面例子可以查看到对比
def findProductPrice(products,productId):
for id, price in products:
if id == productId:
return price
return None
def findUniquePriceByList(products):
uniqueList = []
for _,price in products:
if price not in uniqueList:
uniqueList.append(price)
return len(uniqueList)
def findUniquePriceBySet(products):
uniqueSet = set()
for _,price in products:
uniqueSet.add(price)
return len(uniqueSet)
products = [(1111,1),(2222,2),(3333,3)]
print('The price of product 1111 is {}'.format(findProductPrice(products,1111)))
print('number of unique price is {}'.format(findUniquePriceByList(products)))
p2 = {1111:1,2222:2,3333:3}
print('The price of product 1111 is {}'.format(p2[1111]))
print('number of unique price is {}'.format(findUniquePriceBySet(products)))
import time
id = [x for x in range(0,10000)]
price = [x for x in range(20000,30000)]
product1 = list(zip(id,price))
startUsingList = time.perf_counter()
findUniquePriceByList(product1)
endUsingList = time.perf_counter()
print('time elapse using list: {}'.format(endUsingList - startUsingList))
startUsingList = time.perf_counter()
findUniquePriceBySet(product1)
endUsingList = time.perf_counter()
print('time elapse using set: {}'.format(endUsingList - startUsingList))
字符串(str)
字符串跟C#里的string类似,有几个特点或区别
- 增加了三引号,即可以使用单引号,双引号和三引号
- 增加了切片操作,不过,一样可以索引读取,一样内容不可变
- +=操作做了优化,并非每次都重新省去空间,也可能是直接对将操作者后面增加buff(下面例子对比用时)
- 格式化输出使用.format方式,当然也可以直接用字符串拼接,只是格式化更易读
import time
startTime = time.perf_counter()
s = ''
for n in range(0,100000):
s += str(n)
endTime = time.perf_counter()
print('string elapse using +=: {}'.format(endTime - startTime))
startTime = time.perf_counter()
l = []
for n in range(0,100000):
l.append(str(n))
s = ''.join(l)
endTime = time.perf_counter()
print('string elapse using list: {}'.format(endTime - startTime))