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

什么是容器?

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

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

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

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

  1. li=[1,'a']
  2. for i in li:
  3. print(type(i))
  4. 得出
  5. <class 'int'>
  6. <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等

  1. #!/usr/bin/env python
  2. #--coding: utf-8--
  3. #定义小马列表
  4. li=['twilight','pinkiepie','rainbow dash']
  5. #appand() 对象:列表 参数一:元素 返回值:无
  6. li.append('apple jack')
  7. print("after append:%s"%li)
  8. #插入insert() 对象:列表 参数一:要插入的下标 参数二:要插入的元素
  9. li.insert(1,'rarity')
  10. print("after insert:%s"%li)
  11. #remove() 对象:列表 参数一:元素 返回值:无
  12. li.remove('twilight')
  13. print("after remove:%s"%li)
  14. #pop() 对象:列表 参数一:元素的下标 返回值:无
  15. li.pop(1)
  16. print("after pop:%s"%li)
  17.  
  18. #排序sort() 对象:列表 参数三:倒序 返回值:无
  19. li.sort()
  20. print("after sort:%s"%li)
  21. #合并两个列表extend() 对象:列表 参数一:另一个列表 返回值:无
  22. li.extend(['twilight','rainbow dash'])
  23. print("after extend:%s"%li)
  24. #倒序reverse()--快速降序排序:li.sort(reverse=True)
  25. li.reverse()
  26. print("after reverse:%s"%li)
  27. #计算元素的个数count()
  28. print("rainbow dash个数:%s"%li.count('rainbow dash'))
  29. print("li 元素个数:%s"%len(li))
  30. #查看元素的下标index() 对象:列表 参数一:要查找的元素 参数二:开始 参数三:结束 返回值:下标
  31. print("第二个rainbow dash在哪里?%s"%li.index('rainbow dash',2))
  32. #遍历列表,sys.stdout.write为了不换行输出
  33. import sys
  34. for i in li: #li.__iter__()是list的迭代器,放在这里效果一样
  35. sys.stdout.write(i+",")
  36. print()
  37.  
  38. #清空
  39. li.clear()
  40. 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,元祖的元素的元素会变

  1. tup=('twilight','pinkiepie','rainbow dash')

方法---参考列表:

count(),index()

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

特点:

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

2,可伸缩

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

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

  1. dic1={'ts':'twilight','pp':'pinkiepie'}
  2. print(dic1)
  3. #取值get() 对象:dict 参数一:键 参数二:没有值时代替值 返回值:值
  4. print("ts the fullname:%s"%dic1.get('ts'))
  5. print("rd the fullname:%s"%dic1.get('rd','rainbow dash'))
  6. #添加键值或输出值setdefault() 对象:dict 参数一:键 参数二:没有值时代替值
  7. # 返回值:键的值
  8. print(dic1.setdefault('pp'))
  9. print("pp the fullname:%s"%dic1['pp'])
  10. print(dic1.setdefault('rd',"rainbow dash"))
  11. print("rd the fullname:%s"%dic1['rd'])
  12.  
  13. #遍历字典
  14. import sys
  15. my_keys=[]
  16. my_values=[]
  17. for k in dic1:
  18. my_keys.append(k)
  19. print(my_keys)
  20. for k in dic1:
  21. my_values.append(dic1[k])
  22. print(my_values)
  23. #键值格式化显示
  24. for k,v in dic1.items():
  25. print("%s--->%s"%(k,v))
  26. #直接变成列表
  27. print(list(dic1.keys()))
  28. print(list(dic1.values()))
  29. print(list(dic1.items()))
  30.  
  31. #dic1.pop('rr') #pop删除时,如果原来已经没有的会报错,可以设置默认值
  32. dic1.pop('pp')
  33. print(dic1)
  34.  
  35. #合并两个字典update()
  36. dic2={'aj':'apple jack','fs':'fluttershy'}
  37. dic1.update(dic2)
  38. print(dic1)
  39. dic1.update(rr='rarity',pp='pinkiepie') #可以使用函数可变值来更新字典
  40. print(dic1)
  41. #fromkeys用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值。
  42. seq = ('name', 'age', 'sex')
  43. dict = dict.fromkeys(seq)
  44. print("New Dictionary : %s" % str(dict))
  45. dict = dict.fromkeys(seq, 10)
  46. print("New Dictionary : %s" % str(dict))
  47.  
  48. 运行结果:

{'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,集合判断:是否是子集,是否有交集

集合的操作:

  1. #!/user/bin/env python
  2. #-- coding: utf-8 --
  3. set1={"pp","rr","tw"}
  4. set2={"rd","pp","tw"}
  5. print(set1,set2)
  6. #专门用来输出
  7. def output(*arg):
  8. fm1="{0}是{1}和{2}的{3}"
  9. fm2="{0}{1}{2}的{3}"
  10. if arg[1]==True:
  11. print(fm2.format(arg[0],"是",arg[2],arg[3]))
  12. elif arg[1]==False:
  13. print(fm2.format(arg[0],"不是",arg[2],arg[3]))
  14. else:
  15. print(fm1.format(arg[0],arg[1],arg[2],arg[3]))
  16. #并集
  17.  
  18. set3=set1.union(set2) #set3=set1|set2 set1|=set2
  19. output(set3,set1,set2,"并集")
  20.  
  21. #交集
  22. set3=set1.intersection(set2) #set3=set1&set2 intersection_update更新对象,没有返回值
  23. output(set3,set1,set2,"交集")
  24.  
  25. #差集一
  26. set3=set1.difference(set2) #set1=set1-set2 difference_update
  27. output(set3,set1,set2,"差集")
  28. set3=set2.difference(set1) #set1=set2-set1
  29. output(set3,set2,set1,"差集")
  30.  
  31. #差集二
  32. set3=set1.symmetric_difference(set2) #set1=set1-set2|set2-set1 symmetric_difference_update
  33. output(set3,set1,set2,"差集二")
  34.  
  35. #判断两个集合的关系
  36. #是否是子集
  37. set3={"pp","rr"}
  38. output(set3,set3.issubset(set1),set1,"子集")
  39. output(set1,set1.issubset(set3),set3,"子集")
  40. #判断是否为父集
  41. output(set3,set3.issuperset(set1),set1,"父集")
  42. output(set1,set1.issuperset(set3),set3,"父集")
  43. #判断是否没有交集
  44. output(set2,set2.isdisjoint(set1),set1,"交集")
  45. #执行之后
  46.  
  47. 集合一:{'pp', 'tw', 'rr'} 集合二:{'rd', 'pp', 'tw'}
  48. {'rd', 'pp', 'tw', 'rr'}是{'pp', 'tw', 'rr'}和{'rd', 'pp', 'tw'}的并集
  49. {'pp', 'tw'}是{'pp', 'tw', 'rr'}和{'rd', 'pp', 'tw'}的交集
  50. {'rr'}是{'pp', 'tw', 'rr'}和{'rd', 'pp', 'tw'}的差集
  51. {'rd'}是{'rd', 'pp', 'tw'}和{'pp', 'tw', 'rr'}的差集
  52. {'rd', 'rr'}是{'pp', 'tw', 'rr'}和{'rd', 'pp', 'tw'}的差集二
  53. {'pp', 'rr'}是{'pp', 'tw', 'rr'}的子集
  54. {'pp', 'tw', 'rr'}不是{'pp', 'rr'}的子集
  55. {'pp', 'rr'}不是{'pp', 'tw', 'rr'}的父集
  56. {'pp', 'tw', 'rr'}是{'pp', 'rr'}的父集
  57. {'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,元素的计数变成字典的值
可传入一个迭代去,或者一个字典

  1. #Counter继承dict,具有dict的特性
  2. import collections
  3. dic=collections.Counter()
  4.  
  5. c = collections.Counter() # 可传入空
  6. print(c)
  7. c = collections.Counter({'a': 4, 'b': 2}) # 传入一个字典
  8. print(c)
  9. c = collections.Counter(a=4, b=2) #可传入有关键字的参数
  10. print(c)
  11. c = collections.Counter('gallahad') # 迭代器
  12. print(c)
  13.  
  14. #一些方法
  15. #most_common提取计数最多的前n个元素 对像:Counter 参数一:n 返回值:元组的列表
  16. print(c.most_common(3))
  17.  
  18. #有序字典
  19. #通常一个字典是无序的,当popitem时,删除的元素通常会变
  20. dic1={}
  21. dic1.setdefault('k1','v1')
  22. dic1.setdefault('k2','v2')
  23. dic1.setdefault('k3','v3')
  24. dic1.popitem()
  25. print(dic1)
  26. #OrderedDict会记录传入的数据,当popitem时保证删除的元素是最后传入的那个
  27. #OrderedDict是dict的继承类,可以用dict的各种方法
  28. dic2=collections.OrderedDict()
  29. dic2.setdefault('k1','v1')
  30. dic2.setdefault('k2','v2')
  31. dic2.setdefault('k3','v3')
  32. dic2.popitem()
  33. print(dic2)
  34.  
  35. #默认字典
  36. #默认如果没有定义字典的值,直接使用类型的方法会出错
  37. li={}
  38. li['key01']=[10]
  39. print(li)
  40. #defaultdict会事先定义字典的值的类型
  41. li=collections.defaultdict(list)
  42. li['key01'].append(10)
  43. print(li)
  44.  
  45. 得出:
  46. Counter()
  47. Counter({'a': 4, 'b': 2})
  48. Counter({'a': 4, 'b': 2})
  49. Counter({'a': 3, 'l': 2, 'd': 1, 'g': 1, 'h': 1})
  50. [('a', 3), ('l', 2), ('d', 1)]
  51. {'k2': 'v2', 'k3': 'v3'}
  52. OrderedDict([('k1', 'v1'), ('k2', 'v2')])
  53. {'key01': [10]}
  54. defaultdict(<class 'list'>, {'key01': [10]})

python容器类型:列表,字典,集合等的更多相关文章

  1. Python基础2 列表 字典 集合

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...

  2. 关于Python元祖,列表,字典,集合的比较

      定义 方法 列表 可以包含不同类型的对象,可以增减元素,可以跟其他的列表结合或者把一个列表拆分,用[]来定义的 eg:aList=[123,'abc',4.56,['inner','list'], ...

  3. python容器类型列表的操作

    列表:使用中括号进行表示元素的集合,元素与元素之间使用逗号隔开:列表中的元素可以存放不同的数据类型,但是通常存放相同的数据类型: 1.列表的声明: # 声明一个列表:变量名 = [元素1,元素2] l ...

  4. python中元组/列表/字典/集合

    转自:https://blog.csdn.net/lobo_seeworld/article/details/79404566

  5. Python 学习笔记(1)Python容器:列表、元组、字典与集合

    Python容器:列表.元组.字典与集合 列表: 1.列表 的创建 使用[ ] 或者 list()创建列表:empty_list = [ ] 或者 empty_list= list() 使用list( ...

  6. Python 高效编程技巧实战(2-1)如何在列表,字典, 集合中根据条件筛选数据

    Python 高效编程技巧实战(2-1)如何在列表,字典, 集合中根据条件筛选数据 学习目标 1.学会使用 filter 借助 Lambda 表达式过滤列表.集合.元组中的元素: 2.学会使用列表解析 ...

  7. python之字符串,列表,字典,元组,集合内置方法总结

    目录 数字类型的内置方法 整型/浮点型 字符串类型的内置方法 列表的内置方法 字典的内置方法 元组的内置方法 集合类型内置方法 布尔类型 数据类型总结 数字类型的内置方法 整型/浮点型 加 + 减 - ...

  8. python :列表 字典 集合 类 ----局部变量可以改全局变量

    #列表 字典 集合 类 ----局部变量可以改全局变量,除了整数和字符串 names=["alex","jack","luck"] def ...

  9. python基础一 -------如何在列表字典集合中根据条件筛选数据

    如何在列表字典集合中根据条件筛选数据 一:列表 先随机生成一个列表,过滤掉负数 1,普通for循环迭代判断 2,filter()函数判断,filter(函数,list|tuple|string) fi ...

  10. 第三章 Python容器:列表、元组、字典与集合

      数据结构的分类依据?基本的"数组"在python中是列表, 数据结构的作用?容器,盛放数据,是由原子组成的分子.可以将一群数据进行整合.拆分.重排. 3.2 列表 列表是啥?顺 ...

随机推荐

  1. Selenium 元素定位

    selenium通过driver.findElement(By selector)来定位元素,selector在selenium-java.jar中,里面的方法一共就8种,如下图: 基本定义: By. ...

  2. MSER算法介绍

    MSER代码编译: matlabroot %如果是VS2010则解压VS2010MEX支持文件到MATLAB根目录 unzip('E:\Software\develop Tools\VS2010MEX ...

  3. ReactJS入门指南

    ReactJS入门指南 本文旨在介绍ReactJS的基本知识,并一步步详细介绍React的基本概念和使用方法等,以及相应的Demo.本文在很大程度上参考了React官方文档和官方指南.如果你英语还不错 ...

  4. Eclipse下的Maven

    本文转载自:http://www.cnblogs.com/zlslch/p/5882567.html 当我们无法从本地仓库找到需要的构件的时候,就会从远程仓库下载构件至本地仓库.一般地,对于每个人来说 ...

  5. 【总结】总结写了3个React页面后遇到的各种坑

    标签里用到<label for>的,for 要写成htmlFor 标签里的class要写成className 组件首字母一定要大写 单标签最后一定要闭合 如果html里要空格转义, 注意不 ...

  6. 最新版STS因为JDK版本太低无法启动的解决办法

    -startup plugins/org.eclipse.equinox.launcher_1..jar --launcher.library plugins/org.eclipse.equinox. ...

  7. List Arraylist 数组的区别

    数组.List和ArrayList的区别 数组在内存中是连续存储的,所以它的索引速度是非常的快,而且赋值与修改元素也很简单,比如: ]; //赋值 s[]=]=]="c"; //修 ...

  8. linux下配置ip地址四种方法(图文方法)

    主要是用第四种方法 (1)Ifconfig命令  第一种使用ifconfig命令配置网卡的ip地址.此命令通常用来零时的测试用,计算机启动后 ip地址的配置将自动失效.具体用法如下.Ipconfig  ...

  9. oracle kill session

    kill session 是DBA经常碰到的事情之一.如果kill 掉了不该kill 的session,则具有破坏性,因此尽可能的避免这样的错误发生.同时也应当注意,如果kill 的session属于 ...

  10. 使用Lamda生成函数

    #include <functional> int main() { std::function<]; ; i < ;i++ ) fn[i] = [=]() {return i ...