dictionary

通过键值存储,具有极快的查找速度,但占用空间比list大很多

举个例子,假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list:

names = ['Michael', 'Bob', 'Tracy']
scores = [95, 75, 85]

如果用dict实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。用Python写一个dict如下:

>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95

把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:

>>> d['Adam'] = 67
>>> d['Adam']
67

由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉:

>>> d['Jack'] = 90
>>> d['Jack']
90
>>> d['Jack'] = 88
>>> d['Jack']
88

如果键值key不存在,会报错。

要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:

>>> 'Thomas' in d
False

二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value:

>>> d.get('Thomas')
>>> d.get('Thomas', -1)
-1

要删除一个key,用pop(key)方法,对应的value也会从dict中删除:

>>> d.pop('Bob')
75
>>> d
{'Michael': 95, 'Tracy': 85}

请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。

set

set和dict很像,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

要创建一个set,需要提供一个list作为输入集合:

>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}

注意,传入的参数[1, 2, 3]是一个list,而显示的{1, 2, 3}只是告诉你这个set内部有1,2,3这3个元素,显示的顺序也不表示set是有序的。。

重复元素在set中自动被过滤:

>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
{1, 2, 3}

通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:

>>> s.add(4)
>>> s
{1, 2, 3, 4}

通过remove(key)方法可以删除元素:

>>> s.remove(4)
>>> s
{1, 2, 3}

set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:

>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}

不可变对象

str是不变对象,而list是可变对象。

对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,比如:

>>> a = ['c', 'b', 'a']
>>> a.sort()
>>> a
['a', 'b', 'c']

而对于不可变对象,比如str,对str进行操作呢:

>>> a = 'abc'
>>> a.replace('a', 'A')
'Abc'
>>> a
'abc'

虽然字符串有个replace()方法,也确实变出了'Abc',但变量a最后仍是'abc',应该怎么理解呢?

我们先把代码改成下面这样:

>>> a = 'abc'
>>> b = a.replace('a', 'A')
>>> b
'Abc'
>>> a
'abc'

要始终牢记的是,a是变量,而'abc'才是字符串对象!有些时候,我们经常说,对象a的内容是'abc',但其实是指,a本身是一个变量,它指向的对象的内容才是'abc'

(刚刚接触python,感觉变量就像是一个灵活的“指针”)

最新文章

  1. 最简单的android自定义进度条样式
  2. android 学习JSON
  3. JAVA 入门编程
  4. 动态加载(异步加载)jquery/MUI类库 页面加载完成后加载js类库
  5. IOS开发之控件篇UINavigationController第二章 - 标题
  6. 游戏主循环(Game Loop)
  7. OC小结
  8. ***用php的strpos() 函数判断字符串中是否包含某字符串的方法
  9. java.util.HashMap源码分析
  10. 抓取锁的sql语句-第六次修改
  11. 零基础学习云计算及大数据DBA集群架构师【Linux系统\网络服务及安全配置2015年1月8日周五】
  12. uva133 The Dole Queue ( 约瑟夫环的模拟)
  13. ural1439 Battle with You-Know-Who
  14. 【NO.14】jmeter-处理结果
  15. Hibernate设置时间戳的默认值和更新时间的自动更新
  16. 基于H5的混合开发介绍(一)WebView
  17. 探究ElasticSearch中的线程池实现
  18. jmeter学习笔记(一)
  19. CF932 E. Team Work 结题报告
  20. react-router那些事儿

热门文章

  1. 如何提交本地代码到git仓库
  2. css背景图定位和浮动
  3. Java实现 LeetCode 794 有效的井字游戏 (暴力分析)
  4. Java实现 LeetCode 622 设计循环队列(暴力大法)
  5. Java实现 蓝桥杯VIP 算法训练 数位分离
  6. Java实现 LeetCode 106 从中序与后序遍历序列构造二叉树
  7. Java实现蓝桥杯正则切分
  8. Swagger使用的时候报错:Failed to load API definition
  9. Ement 学习
  10. centos7 和centos6 服务操作命令对比