python中内置的数据类型有列表(list)元组(tuple)字典(directory)。

1 list

list是一种可变的有序的集合。来看一个list实例:

  1. #第一种方法:
  2. >>> name=['liming','xiaohong',]
  3. >>> name
  4. ['liming', 'xiaohong']
  5. #第二种方法:
  6. >>> age=list([18,17,])
  7. >>> age
  8. [18, 17]

list有许多功能:

  1. >>> name
  2. ['liming', 'xiaohong']
  3. >>> len(name)
  4. 2
  5. >>> name.__len__()
  6. 2

__len__()查看list中元素的个数

  1. >>> name
  2. ['liming', 'xiaohong', 'xiaoqiang']
  3. >>> name[2]
  4. 'xiaoqiang'

查看索引值所对应的元素

  1. >>> name
  2. ['liming', 'xiaohong', 'xiaoqiang']
  3. >>> name.index('xiaohong')
  4. 1
  5. #如果没有该元素,则会报错
  6. >>> name.index('xiao')
  7. Traceback (most recent call last):
  8. File "<stdin>", line 1, in <module>
  9. ValueError: 'xiao' is not in list

index()查看元素所对应的索引值

  1. >>> name
  2. ['liming', 'xiaohong', 'xiaoqiang']
  3. >>> name.append('xiaohuang')
  4. >>> name
  5. ['liming', 'xiaohong', 'xiaoqiang', 'xiaohuang']

append()追加元素到末尾

  1. >>> name
  2. ['liming', 'xiaohong', 'xiaoqiang']
  3. >>> name.insert(1,'yefan')
  4. >>> name
  5. ['liming', 'yefan', 'xiaohong', 'xiaoqiang']

insert()插入元素到指定索引位置

  1. >>> name
  2. ['liming', 'yefan', 'xiaohong']
  3. >>> result=name.pop()
  4. #将最后一个元素赋值给result
  5. >>> name
  6. ['liming', 'yefan']
  7. >>> result
  8. 'xiaohong'

pop()删除最后一个元素

  1. >>> name
  2. ['liming', 'yefan', 'xiaoqiang']
  3. >>> name.pop(1)
  4. 'yefan'
  5. >>> name
  6. ['liming', 'xiaoqiang']

remove()删除指定位置的元素

  1. >>> name
  2. ['liming', 'yefan', 'xiaoqiang']
  3. >>> name[1]='xiaohong'
  4. >>> name
  5. ['liming', 'xiaohong', 'xiaoqiang']

将某个元素替换成其他元素

  1. >>> name
  2. ['liming', 'xiaohong', 'xiaoqiang']
  3. >>> name.extend(['yefan','heihuang',])
  4. >>> name
  5. ['liming', 'xiaohong', 'xiaoqiang', 'yefan', 'heihuang']

extend()追加列表到末尾

  1. >>> name
  2. ['liming', 'xiaohong', 'xiaoqiang', 'yefan', 'heihuang']
  3. >>> name.reverse()
  4. >>> name
  5. ['heihuang', 'yefan', 'xiaoqiang', 'xiaohong', 'liming']

reverse()反转元素顺序

另外,list元素也可以是另一个list(字典也可以):

  1. >>> name=['liming', 'xiaohong', 'xiaoqiang']
  2. >>> age
  3. [18, 17]
  4. >>> name.append(age)
  5. >>> name
  6. ['liming', 'xiaohong', 'xiaoqiang', [18, 17]]

再来看list中一个让我刚学习时比较纠结的例子:

  1. >>> n=[1]
  2. >>> l=n
  3. >>> l
  4. [1]
  5. >>> n=[4]
  6. >>> l
  7. [1]
  8. #上例中n变了,l没有变
  9.  
  10. >>> n=[1,2]
  11. >>> g=n
  12. >>> g
  13. [1, 2]
  14. >>> n[1]=3
  15. >>> g
  16. [1, 3]
    #在这里,n变了,g也跟着变了!!!

靠!这是为什么呢?欲知原因,请看--我的另一个博文 python基础之赋值/深copy/浅copy

当我们想要创建一个比较繁琐的list的时候,可能会用到循环,比如,我们要创建list为:[1,4,9,16,25……100]时。可能就会这样写:

  1. l=[]
  2. for i in range(1,11):
  3. a=i*i
  4. l.append(a)
  5. print(l)

是不是感觉很麻烦,在python中,我们其实可以用一行代码来实现这个list,这里就要用到列表生成式了:

列表生成式:

  1. >>> [i*i for i in range(1,11)]
  2. [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

说一下格式:元素(上例中为i*i)+空格+生成元素的表达式(这样说其实并不准确,但我感觉墨水较少,实在是无法准确的形容。上例中为:for i in range(1,11))

列表生成式也可以帮助我们实现一些更为复杂的list:

  1. #可以有两层循环
  2. print([m+n for m in range(3) for n in range(3)])
  3. [0, 1, 2, 1, 2, 3, 2, 3, 4]
  4.  
  5. print([m+n for m in 'abc' for n in 'abc'])
  6. ['aa', 'ab', 'ac', 'ba', 'bb', 'bc', 'ca', 'cb', 'cc']

  #for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:

  1.  
  1. >>> [x * x for x in range(1, 11) if x % 2 == 0]
  2. [4, 16, 36, 64, 100]
  1. #将格式化和列表生成式相结合 print(['%s%s' % (i,i) for i in range(1,11)]) ['', '', '', '', '', '', '', '', '', '']

事实上,不仅可以有两层循环,三层或者更多层也是可以的。

2  tuple

是一种另类的list,但是他的功能相较于list要少,因为tuple不支持修改,也就是不支持append,pop,extend,insert……

定义一个tuple:

  1. #第一种方法
  2. >>> age=(1,3)
  3. >>> age
  4. (1, 3)
  5. #第二种方法
  6. >>> age=tuple((1,4,))
  7. >>> age
  8. (1, 4)

如果要定义一个空的tuple,可以写成()

  1. >>> age=()
  2. >>> age
  3. ()

但是,要定义一个只有1个元素的tuple,如果你这么定义:

  1. >>> age=(1)
  2. >>> age
  3. 1
  4. >>> type(age)
  5. <class 'int'>

定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1

所以一般定义只有一个元素的tuple时,要加个逗号:

  1. >>> age=(1,)
  2. >>> age
  3. (1,)

实际上tuple也是可变的,前文中所说的不可变指的是tuple元素不可变,但是tuple中的元素的元素是可以改变的。

  1. >>> info=(['liming','',],['xiaohong','',])
  2. >>> info
  3. (['liming', ''], ['xiaohong', ''])
  4. >>> info[1][1]=12
  5. >>> info
  6. (['liming', ''], ['xiaohong', 12])

在这个例子中改变的不是tuple的元素,而是list的元素。

3  directory

字典是无序的由键值对组成的集合,具有极快的查找速度。元素可以是list tuple directory

为什么说dict具有极快的查找速度?现在来看一个小程序:

  1. name=['liming','xiaohong','xiaoqiang',]
  2. score=[88,77,66,]
  3. in_name=input('Please input your name:')
  4. in_name.strip()  
  5. index_name=name.index(in_name)
  6. score_of_name=score[index_name]
  7. print('Your score is:%s'%(score_of_name))

当列表的元素越多,输入名字后匹配到的时间就越长。因为我们需要遍历整个list,然后匹配到相应的name以及score。

如果用dict实现,只需要一个“名字”-“成绩”的对照表,这个对照表是按照一定的计算方法存放的,什么计算方法呢?打个比方,我们可以根据名字的首字母在字母表中的顺序,首字母相同的名字再根据第二字母在字母表中的顺序排序,以此类推……。这样我们查找名字时就会方便快捷很多。直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。以上只是打比方,实际上dict可能是根据hash来进行排序计算,有兴趣的同学可以搜索一下。

定义一个字典:

  1. >>> info={'liming':16,'xiaohong':12}
  2. >>> info
  3. {'xiaohong': 12, 'liming': 16}
  4. #格式是一个唯一的键对应一个值。

但是,当第二次定义一个键时,会出现这种情况:

  1. >>> info
  2. {'xiaohong': 12, 'liming': 16}
  3. >>> info={'liming':16,'xiaohong':12,'liming':12}
  4. >>> info
  5. {'xiaohong': 12, 'liming': 12}

也就是第二个相同的键会覆盖掉第一个相同的键

对某个键的值进行修改:

  1. >>> d['liming']
  2. 88
  3. >>> d
  4. {'xiaohong': 77, 'liming': 88}
  5. >>> d['liming']
  6. 88
  7. >>> d['liming']=99
  8. >>> d
  9. {'xiaohong': 77, 'liming': 99}

但是如果当这个键不存在时,就会报错:

  1. >>> d
  2. {'xiaohong': 77, 'liming': 99}
  3. >>> d['xiao']
  4. Traceback (most recent call last):
  5. File "<stdin>", line 1, in <module>
  6. KeyError: 'xiao'
  7. #我们可以用in或者字典所提供的get功能来判断键是否存在
  8. #in
  9. >>> d
  10. {'xiaohong': 77, 'liming': 99}
  11. >>> 'xiaohong' in d
  12. True
  13. #注意仅仅是找键,而不是找值:
  14. >>> 77 in d
  15. False
  16. #get
  17. >>> d.get('xiaohong')
  18. 77
  19. #当不存在时,可以定义返回值,默认返回值是None
  20. >>> d.get('xiao')
  21. >>> result=d.get('xiao',0)
  22. >>> result
  23. 0

和list比较,dict有以下几个特点:

  1. 查找和插入的速度极快,不会随着key的增加而变慢;
  2. 需要占用大量的内存,内存浪费多。

而list相反:

  1. 查找和插入的时间随着元素的增加而增加;
  2. 占用空间小,浪费内存很少。

要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:

  1. >>> score
  2. [88, 77, 66]
  3. >>> name
  4. ['liming', 'xiaohong', 'xiaoqiang']
  5. >>> d={name:score,'liming':99}
  6. Traceback (most recent call last):
  7. File "<stdin>", line 1, in <module>
  8. TypeError: unhashable type: 'list'

dict的功能:

  1. #当[]中的键不存在时,即为添加
  2. >>> dic={'liming':15}
  3. >>> dic['xiaohong']=20
  4. >>> dic
  5. {'liming': 15, 'xiaohong': 20}
  6.  
  7. #当[]内的键存在时,即为修改
  8. >>> dic
  9. {'liming': 15, 'xiaohong': 20}
  10. >>> dic['liming']=20
  11. >>> dic
  12. {'liming': 20, 'xiaohong': 20}

dic[]=添加新的键值对/修改某个键的值

  1. >>> d
  2. {'xiaohong': 77, 'liming': 99}
  3. >>> d.clear()
  4. >>> d
  5. {}

clear()清空字典

  1. d
  2. {'xiaohong': 77, 'liming': 99}
  3. >>> d.get('xiaohong')
  4. 77
  5. >>> d.get('xiao')
  6. >>> result=d.get('xiao',0)
  7. >>> result
  8. 0

get()获取某个键是否在该字典中,若存在,则返回对应的value,若不存在,则默认返回None,可以自定义返回值

  1. >>> d
  2. {'xiaohong': 77, 'liming': 99}
  3. >>> d.keys()
  4. dict_keys(['xiaohong', 'liming'])

keys()列出所有的键key

  1. >>> d
  2. {'xiaohong': 77, 'liming': 99}
  3. >>> d.values()
  4. dict_values([77, 99])

values()列出所有的值values

  1. >>> d
  2. {'xiaohong': 88, 'liming': 99}
  3. >>> d.update({'xiaohong':77})
  4. >>> d
  5. {'xiaohong': 77, 'liming': 99}
  6.  
  7. >>> d['xiaohong']=66
  8. >>> d
  9. {'xiaohong': 66, 'liming': 99}

update()更新某个键的值

  1. >>> d
  2. {'xiaohong': 66, 'liming': 99}
  3. >>> d.pop('xiaohong')
  4. 66
  5. >>> d
  6. {'liming': 99}

pop()删除某个键值对

set集合

set集合类似于dict,查找速度十分快,无序,不重复。但是,set仅仅是key的集合,并没有value。

定义set

  1. >>> a=set([1,1,2,3,4,4,5,])
  2. >>> a
  3. {1, 2, 3, 4, 5}
  4. #重复的会被过滤

set的功能:

  1. >>> a
  2. {1, 2, 3, 4, 5}
  3. >>> a.add(7)
  4. >>> a
  5. {1, 2, 3, 4, 5, 7}

add()添加元素

  1. >>> a
  2. {1, 2, 3, 4, 5, 7}
  3. >>> a.clear()
  4. >>> a
  5. set()

clear()清空所有元素

  1. #有两种取差集
  2. #一种是普通差集,一种是对称差集。
  3. #先看普通差集:
  4. >>> a
  5. {1, 2, 3}
  6. >>> b
  7. {2, 3, 4}
  8. >>> a.difference(b)
  9. {1}
  10. #a并没有改变
  11. >>> a
  12. {1, 2, 3}
  13. #我们可以将a.difference(b)赋值给一个变量
  14. >>> ret=a.difference(b)
  15. >>> ret
  16. {1}
  17. #有另一种方法可以直接将差集赋值给a
  18. >>> a.difference_update(b)
  19. >>> a
  20. {1}
  21. #对称差集就是a.difference(b) 和b.difference(a)合并
  22. >>> a
  23. {1, 2, 3}
  24. >>> b
  25. {2, 3, 4}
  26. >>> a.symmetric_difference(b)
  27. {1, 4}

difference() difference_update()取差集

  1. >>> a
  2. {1, 2, 3}
  3. >>> b
  4. {2, 3, 4}
  5. >>> a.intersection(b)
  6. {2, 3}
  7. #更新自身的取交集
  8. >>> a
  9. {1, 2, 3}
  10. >>> b
  11. {2, 3, 4}
  12. >>> a.intersection_update(b)
  13. >>> a
  14. {2, 3}

intersection() intersection_update()取交集

  1. >>> b
  2. {3, 4}
  3. >>> ret = b.pop()
  4. >>> ret
  5. 3
  6. >>> b
  7. {4}

pop()删除某个元素

python基础之02列表/元组/字典/set集合的更多相关文章

  1. python基础===如何在列表,字典,集合中根据条件筛选数据

    #常见的操作如下: data = [1, 5, -3, -2, 6, 0, 9] res = [] for x in data: if x>=0: res.append(x) print(res ...

  2. python数据结构-如何在列表、字典、集合中根据条件筛选数据

    如何在列表.字典.集合中根据条件筛选数据 问题举例: 过滤列表[1, 2, 5, -1, 9, 10]中的负数 筛选字典{“zhangsan”:97, "lisi":80, &qu ...

  3. python 基础篇 04(列表 元组 常规操作)

    本节主要内容:1. 列表2. 列表的增删改查3. 列表的嵌套4. 元组和元组嵌套5. range 一. 列表1.1 列表的介绍列表是python的基础数据类型之一 ,其他编程语言也有类似的数据类型. ...

  4. python基础数据类型之列表,元组操作

    一.列表的索引和切片1.列表的索引列表和字符串一样样拥有索引 lst = ["a","b","c"] print(lst[0]) # 获取第 ...

  5. Python基础(4)_字典、集合、bool值

    三.字典 定义:{key1:value1,key2:value2},key-value结构,key必须是不可变类型,或者可hash 基本形式:key:value特性: 1.可存放多个值 2.可修改指定 ...

  6. Python自动化开发 - 字符串, 列表, 元组, 字典和和文件操作

    一.字符串 特性:字符串本身不可修改,除非字符串变量重新赋值.Python3中所有字符串都是Unicode字符串,支持中文. >>> name  = "Jonathan&q ...

  7. python的对象类型-----列表&元组&字典

    列表: #定义列表 l=[1,'a',[3,4]] #l=list([1,'a',[3,4]]) #取值 print(l[0]) print(l[2][0]) l=[1,2,[['a','b'],'c ...

  8. Python基础语法之列表 元组

    1 列表 列表由一系列按照特定顺序的元素组成,其中的元素可以使不同的数据类型,用[ ]来表示列表,用逗号来分割列表中的元素. 1.1 列表操作之切片 a = [1, 2, 3, 4, 5, 6, 7, ...

  9. python容器类型:列表,字典,集合等

    容器的概念我是从C++的STL中学到的 什么是容器? 容器是用来存储和组织其他对象的对象. 也就是说容器里面可以放很多东西,这些东西可以是字符串,可以是整数,可以是自定义类型,然后把这些东西有组织的存 ...

随机推荐

  1. Spring MVC controller的方法返回值

    ModeAndView 可以在构造时确定需要跳转的页面也可以通过setViewName方法来确定需要跳转的页面 String 指定返回页面的视图名称,页面跳转,如果加了@ResponseBody注解, ...

  2. 20172319 2018.03.27-04.05 《Java程序设计》第4周学习总结

    20172319 2018.03.27-04.05 <Java程序设计>第4周学习总结 教材学习内容总结 第四章 编写类 类与对象的回顾:对象是有状态的,状态由对象的属性值确定.属性由类中 ...

  3. cron延时

    2)Cron表达式范例: 每隔5秒执行一次:*/5 * * * * ? 每隔1分钟执行一次:0 */1 * * * ? 每天23点执行一次:0 0 23 * * ? 每天凌晨1点执行一次:0 0 1 ...

  4. Task 4.3 求环形数组的最大子数组和

    任务要求:输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.    如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n- ...

  5. User survey(用户调研)

    郑文武——小学二年级学生 姓名 郑文武  性别.年龄 男.9岁                      职业 学生 收入 父母给的零花钱 知识层次和能力 会使用手机 生活/工作情况 努力学习但数学成 ...

  6. Web应用程序的基本安全实践

    创建安全Web应用程序的主题非常广泛.它需要研究以了解安全漏洞.您还需要熟悉Windows..NET框架和ASP.NET的安全设施.最后,有必要了解如何使用这些安全特性来对付威胁. 即使您没有安全方面 ...

  7. iOS开发 tableView点击下拉扩展 + 内嵌collectionView上传图片效果

    ---恢复内容开始--- //需要的效果 1.设置window的根视图控制器为一个UITableViewController #import "AppDelegate.h"#imp ...

  8. React---点击按钮实现内容复制功能

    思路: 1.给要复制的内容容器添加一个标签(可以是ID,可以是类名等),通过dom技术获取该容器对象: 2.创建Range对象(某个区域内连续的内容),把该容器对象放进去: 3.将Range对象添加到 ...

  9. 关于VS2005中C#代码用F12转到定义时,总是显示从元数据的问题

    元数据是:NET 程序集中的标记信息. 是在代码中选择了转到定义时候给定位的吧.因为没有找到源代码,VS通过反射读取元数据中的信息生成了那个. 解决方法: 1. 要把项目先添加到解决方案中. 2. 再 ...

  10. 读书笔记-《Java核心技术卷I-基础知识》

    1.定时器Timer类 构造定时器时,需要设置一个时间间隔,并告知定时器,当到达时间间隔时需要做什么操作.定时器需要知道调用哪一个方法,并要求传递的对象所属的类实现了java.awt.event包的A ...