euewrqe

容器的概念我是从C++的STL中学到的

什么是容器?

容器

容器是用来存储和组织其他对象的对象。

也就是说容器里面可以放很多东西,这些东西可以是字符串,可以是整数,可以是自定义类型,然后把这些东西有组织的存放在内存中。

但是C++有一点就是容器要事先定义好类型,也就是一开始是字符串的后面都只能放字符串。

但是python的容器里面可以放任何类型

li=[1,\'a\']
for i in li:
    print(type(i))
得出
<class \'int\'>
<class \'str\'>

容器有哪些?

以C++的STL为例,容器有向量(vector),列表(list),数组(array),队列(queue),双向队列(deque),栈(stack),集合(set),映射(map)等

那python里面也一样,有列表(list),元祖(tuple),集合(set),字典(dict),队列(queue)等

容器通常配有迭代器(iter),迭代器是用来遍历容器的利器

下面来看看python每个容器的详细功能,对照C++的STL:

列表(list)

python的列表的特点:

1,具有可伸缩性,可以随时添加和删除元素

2,可以很方便的取元素

3,列表元素可以是不同类型

python列表的操作:

添加append,插入insert,删除remove/pop,排序sort,倒序reverse,合并extend等

#!/usr/bin/env python
#--coding: utf-8--
#定义小马列表
li=[\'twilight\',\'pinkiepie\',\'rainbow dash\']
#appand()   对象:列表  参数一:元素   返回值:无
li.append(\'apple jack\')
print("after append:%s"%li)
#插入insert() 对象:列表   参数一:要插入的下标  参数二:要插入的元素
li.insert(1,\'rarity\')
print("after insert:%s"%li)
#remove()   对象:列表   参数一:元素     返回值:无
li.remove(\'twilight\')
print("after remove:%s"%li)
#pop()  对象:列表   参数一:元素的下标   返回值:无
li.pop(1)
print("after pop:%s"%li)

#排序sort()   对象:列表 参数三:倒序  返回值:无
li.sort()
print("after sort:%s"%li)
#合并两个列表extend() 对象:列表   参数一:另一个列表  返回值:无
li.extend([\'twilight\',\'rainbow dash\'])
print("after extend:%s"%li)
#倒序reverse()--快速降序排序:li.sort(reverse=True)
li.reverse()
print("after reverse:%s"%li)
#计算元素的个数count()
print("rainbow dash个数:%s"%li.count(\'rainbow dash\'))
print("li 元素个数:%s"%len(li))
#查看元素的下标index() 对象:列表   参数一:要查找的元素  参数二:开始  参数三:结束  返回值:下标
print("第二个rainbow dash在哪里?%s"%li.index(\'rainbow dash\',2))
#遍历列表,sys.stdout.write为了不换行输出
import sys
for i in li:            #li.__iter__()是list的迭代器,放在这里效果一样
    sys.stdout.write(i+",")
print()

#清空
li.clear()
print("after clear:%s" %(li))
运行结果:

after append:[\'twilight\', \'pinkiepie\', \'rainbow dash\', \'apple jack\']
after insert:[\'twilight\', \'rarity\', \'pinkiepie\', \'rainbow dash\', \'apple jack\']
after remove:[\'rarity\', \'pinkiepie\', \'rainbow dash\', \'apple jack\']
after pop:[\'rarity\', \'rainbow dash\', \'apple jack\']
after sort:[\'apple jack\', \'rainbow dash\', \'rarity\']
after extend:[\'apple jack\', \'rainbow dash\', \'rarity\', \'twilight\', \'rainbow dash\']
after reverse:[\'rainbow dash\', \'twilight\', \'rarity\', \'rainbow dash\', \'apple jack\']
rainbow dash个数:2
li 元素个数:5
第二个rainbow dash在哪里?3
rainbow dash,twilight,rarity,rainbow dash,apple jack,
after clear:[]

 

元祖(tuple)----相当于常量数组

1,元素个数不会变

2,元祖的元素不会变

3,元祖的元素的元素会变

tup=(\'twilight\',\'pinkiepie\',\'rainbow dash\')

方法---参考列表:

count(),index()

 

字典(dict)----STL中的映射(map)

特点:

1,键值对,数据结构:散列表(hash),查找快

2,可伸缩

3,键只能是基本数据类型,值可以是任意类型,键的类型可以不同

字典的操作:单独取出键值,用键取值,用值取键,添加,删除,遍历

dic1={\'ts\':\'twilight\',\'pp\':\'pinkiepie\'}
print(dic1)
#取值get()    对象:dict     参数一:键   参数二:没有值时代替值   返回值:值
print("ts the fullname:%s"%dic1.get(\'ts\'))
print("rd the fullname:%s"%dic1.get(\'rd\',\'rainbow dash\'))
#添加键值或输出值setdefault()   对象:dict     参数一:键   参数二:没有值时代替值
#     返回值:键的值
print(dic1.setdefault(\'pp\'))
print("pp the fullname:%s"%dic1[\'pp\'])
print(dic1.setdefault(\'rd\',"rainbow dash"))
print("rd the fullname:%s"%dic1[\'rd\'])

#遍历字典
import sys
my_keys=[]
my_values=[]
for k in dic1:
    my_keys.append(k)
print(my_keys)
for k in dic1:
    my_values.append(dic1[k])
print(my_values)
#键值格式化显示
for k,v in dic1.items():
    print("%s--->%s"%(k,v))
#直接变成列表
print(list(dic1.keys()))
print(list(dic1.values()))
print(list(dic1.items()))

#dic1.pop(\'rr\')      #pop删除时,如果原来已经没有的会报错,可以设置默认值
dic1.pop(\'pp\')
print(dic1)

#合并两个字典update()
dic2={\'aj\':\'apple jack\',\'fs\':\'fluttershy\'}
dic1.update(dic2)
print(dic1)
dic1.update(rr=\'rarity\',pp=\'pinkiepie\')   #可以使用函数可变值来更新字典
print(dic1)
#fromkeys用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值。
seq = (\'name\', \'age\', \'sex\')
dict = dict.fromkeys(seq)
print("New Dictionary : %s" %  str(dict))
dict = dict.fromkeys(seq, 10)
print("New Dictionary : %s" %  str(dict))

运行结果:

{\'pp\': \'pinkiepie\', \'ts\': \'twilight\'}
ts the fullname:twilight
rd the fullname:rainbow dash
pinkiepie
pp the fullname:pinkiepie
rainbow dash
rd the fullname:rainbow dash
[\'pp\', \'rd\', \'ts\']
[\'pinkiepie\', \'rainbow dash\', \'twilight\']
pp--->pinkiepie
rd--->rainbow dash
ts--->twilight
[\'pp\', \'rd\', \'ts\']
[\'pinkiepie\', \'rainbow dash\', \'twilight\']
[(\'pp\', \'pinkiepie\'), (\'rd\', \'rainbow dash\'), (\'ts\', \'twilight\')]
{\'rd\': \'rainbow dash\', \'ts\': \'twilight\'}
{\'aj\': \'apple jack\', \'rd\': \'rainbow dash\', \'ts\': \'twilight\', \'fs\': \'fluttershy\'}
{\'pp\': \'pinkiepie\', \'rr\': \'rarity\', \'rd\': \'rainbow dash\', \'ts\': \'twilight\', \'fs\': \'fluttershy\', \'aj\': \'apple jack\'}
New Dictionary : {\'name\': None, \'sex\': None, \'age\': None}
New Dictionary : {\'name\': 10, \'sex\': 10, \'age\': 10}

 

集合(set)

集合的特点:

1,一个容器,集合的元素不重复

2,是无序的hash表

3,集合的操作:并集,交集,差集

4,集合判断:是否是子集,是否有交集

集合的操作:

#!/user/bin/env python
#-- coding: utf-8 --
set1={"pp","rr","tw"}
set2={"rd","pp","tw"}
print(set1,set2)
#专门用来输出
def output(*arg):
    fm1="{0}是{1}和{2}的{3}"
    fm2="{0}{1}{2}的{3}"
    if arg[1]==True:
        print(fm2.format(arg[0],"",arg[2],arg[3]))
    elif arg[1]==False:
        print(fm2.format(arg[0],"不是",arg[2],arg[3]))
    else:
        print(fm1.format(arg[0],arg[1],arg[2],arg[3]))
#并集

set3=set1.union(set2)     #set3=set1|set2   set1|=set2
output(set3,set1,set2,"并集")

#交集
set3=set1.intersection(set2)        #set3=set1&set2   intersection_update更新对象,没有返回值
output(set3,set1,set2,"交集")

#差集一
set3=set1.difference(set2)          #set1=set1-set2     difference_update
output(set3,set1,set2,"差集")
set3=set2.difference(set1)         #set1=set2-set1
output(set3,set2,set1,"差集")

#差集二
set3=set1.symmetric_difference(set2)   #set1=set1-set2|set2-set1     symmetric_difference_update
output(set3,set1,set2,"差集二")

#判断两个集合的关系
#是否是子集
set3={"pp","rr"}
output(set3,set3.issubset(set1),set1,"子集")
output(set1,set1.issubset(set3),set3,"子集")
#判断是否为父集
output(set3,set3.issuperset(set1),set1,"父集")
output(set1,set1.issuperset(set3),set3,"父集")
#判断是否没有交集
output(set2,set2.isdisjoint(set1),set1,"交集")
#执行之后

集合一:{\'pp\', \'tw\', \'rr\'} 集合二:{\'rd\', \'pp\', \'tw\'}
{\'rd\', \'pp\', \'tw\', \'rr\'}是{\'pp\', \'tw\', \'rr\'}和{\'rd\', \'pp\', \'tw\'}的并集
{\'pp\', \'tw\'}是{\'pp\', \'tw\', \'rr\'}和{\'rd\', \'pp\', \'tw\'}的交集
{\'rr\'}是{\'pp\', \'tw\', \'rr\'}和{\'rd\', \'pp\', \'tw\'}的差集
{\'rd\'}是{\'rd\', \'pp\', \'tw\'}和{\'pp\', \'tw\', \'rr\'}的差集
{\'rd\', \'rr\'}是{\'pp\', \'tw\', \'rr\'}和{\'rd\', \'pp\', \'tw\'}的差集二
{\'pp\', \'rr\'}是{\'pp\', \'tw\', \'rr\'}的子集
{\'pp\', \'tw\', \'rr\'}不是{\'pp\', \'rr\'}的子集
{\'pp\', \'rr\'}不是{\'pp\', \'tw\', \'rr\'}的父集
{\'pp\', \'tw\', \'rr\'}是{\'pp\', \'rr\'}的父集
{\'rd\', \'pp\', \'tw\'}不是{\'pp\', \'tw\', \'rr\'}的交集

 

collections模块-----扩展容器

Counter,nametuple,defaultdict,OrderDict

 

Counter:

Dict subclass for counting hashable items. Sometimes called a bag
or multiset. Elements are stored as dictionary keys and their counts
are stored as dictionary values.
传入一个包,元素变成字典的key,元素的计数变成字典的值
可传入一个迭代去,或者一个字典

 

#Counter继承dict,具有dict的特性
import collections
dic=collections.Counter()

c = collections.Counter()  # 可传入空
print(c)
c = collections.Counter({\'a\': 4, \'b\': 2})  # 传入一个字典
print(c)
c = collections.Counter(a=4, b=2)   #可传入有关键字的参数
print(c)
c = collections.Counter(\'gallahad\')  # 迭代器
print(c)

#一些方法
#most_common提取计数最多的前n个元素    对像:Counter  参数一:n   返回值:元组的列表
print(c.most_common(3))

#有序字典
#通常一个字典是无序的,当popitem时,删除的元素通常会变
dic1={}
dic1.setdefault(\'k1\',\'v1\')
dic1.setdefault(\'k2\',\'v2\')
dic1.setdefault(\'k3\',\'v3\')
dic1.popitem()
print(dic1)
#OrderedDict会记录传入的数据,当popitem时保证删除的元素是最后传入的那个
#OrderedDict是dict的继承类,可以用dict的各种方法
dic2=collections.OrderedDict()
dic2.setdefault(\'k1\',\'v1\')
dic2.setdefault(\'k2\',\'v2\')
dic2.setdefault(\'k3\',\'v3\')
dic2.popitem()
print(dic2)

#默认字典
#默认如果没有定义字典的值,直接使用类型的方法会出错
li={}
li[\'key01\']=[10]
print(li)
#defaultdict会事先定义字典的值的类型
li=collections.defaultdict(list)
li[\'key01\'].append(10)
print(li)

得出:
Counter()
Counter({\'a\': 4, \'b\': 2})
Counter({\'a\': 4, \'b\': 2})
Counter({\'a\': 3, \'l\': 2, \'d\': 1, \'g\': 1, \'h\': 1})
[(\'a\', 3), (\'l\', 2), (\'d\', 1)]
{\'k2\': \'v2\', \'k3\': \'v3\'}
OrderedDict([(\'k1\', \'v1\'), (\'k2\', \'v2\')])
{\'key01\': [10]}
defaultdict(<class \'list\'>, {\'key01\': [10]})
View Code

 

分类:

技术点:

相关文章: