数据结构

Python中的内置数据结构(Built-in Data Structure):列表list、元组tuple、字典dict、集合set,这里只着重说前三个

>>> d=dict(zip(('e','r'),(1,2)))
>>> d.keys()
dict_keys(['e', 'r'])
>>> d.values()
dict_values([1, 2])
>>> d.items()
dict_items([('e', 1), ('r', 2)])

列表

列表是Python中内置可变序列,是若干元素的有序集合。列表中的每一个数据称为元素,列表的所有元素放在一对中括号 [ 和 ] 中,并使用逗号分隔开

关于列表的一些重要操作函数汇总

接下来是几个列表涉及的重要知识点

1.extend()和append()

extend()是将加入对象中的元素拼接到列表对象的后面,而append()则是将加入对象直接加入列表末尾。

例:

  1. >>> a=[,,]
  2. >>> a.append([,]) #使用append
  3. >>> a
  4. [, , , [, ]]
  5. >>> a=[,,]
  6. >>> a.extend([,]) #使用extend
  7. >>> a
  8. [, , , , ]

2.列表的删除

一般想到列表的删除会想到循环+remove()的方法,但是在python中这种方法可能会产生想不到的错误。

例:

  1. >>> a=[,,,,,,]
  2. >>> for x in a:
  3. ... if x==: #寻找出等于1的元素并删除
  4. ... a.remove(x)
  5. ...
  6. >>> a
  7. [, , , ]

可以看到并没有完全删除等于1的元素,原因在于python删除列表中的元素后,元素后面的索引会跟着每个加一,而遍历到的索引值不变,这就会造成一些元素被跳过的情况。

解决这个问题我们可以使用列表的浅拷贝或者使用while循环进行删除,但这两种办法并不是高效的,这里给出两种较为高效率的办法。

a.将列表倒序

  1. >>> a=[,,,,,,]
  2. >>> for x in a[::-1]:
  3. ... if x==:
  4. ... a.remove(x)
  5. ...
  6. >>> a
  7. [, , ]

b.使用列表生成式将不删除的元素筛选出来

  1. [val for val in my_list if val != ]

3.切片操作和range()函数

切片返回的是对象的浅拷贝,切片使用2个冒号分隔的3个数字来完成,第一个数字表示切片开始位置(默认为0),第二个数字表示切片截止(但不包含)位置(默认为列表长度),第三个数字表示切片的步长(默认为1),当步长省略时可以顺便省略最后一个冒号。

给出几个例子:

  1. >>> a=[,,,,,,,]
  2. >>> a[:] #注意结尾是不算在给出的列表之中
  3. [, ]
  4. >>> a[::] #将步长设置为2
  5. [, , , ]
  6. >>> a[::-] #步长为-1则为逆序
  7. [, , , , , , , ]
  8. >>> a[:-] #尾项为负数代表从最后一项相减开始
  9. [, , , , , ]
  10. >>> a[::-] #逆序切片时需注意首尾的颠倒
  11. [, , ]

关于range()函数,这里借我们老师的一个说法来说明

内置函数range()的语法为:
range([start,] stop[, step])
其接收3个参数,第一个参数表示起始值(默认为0),第二个参数表示终止值(结果中不包括这个值),第三个参数表示步长(默认为1)

该函数在Python 3中返回一个range可迭代对象,在Python 2中返回一个包含若干整数的列表。另外,Python 2还提供了一个内置函数xrange()(Python 3中不提供该函数),语法与range()函数一样,但是返回xrange可迭代对象,类似于Python 3的range()函数,其特点为惰性求值,而不是像range()函数一样返回列表。例如下面的Python 2.7代码:

  1. >>> range()
  2. [, , , , , , , , , ]
  3. >>> xrange()
  4. xrange()
  5. >>> list(xrange())
  6. [, , , , , , , , , ]

关于惰性求值:

大意延迟求值,即返回时不给定数据结构,根据需要来进行转化,以便于节省计算机资源,这个思路在python3中很常见。

5.zip()函数和enumerate()函数

zip(列表1,列表2,…) 将多个列表对应位置元素组合为元组,并返回包含这些元组的列表

  1. >>> a = [,,]
  2. >>> b = [,,]
  3. >>> c = [,,]
  4. >>> d = zip(a, b, c)
  5. >>> d
  6. [(, , ), (, , ), (, , )]
  7. #而在Python 3中则需要这样使用:
  8. >>> a = [, , ]
  9. >>> b = [, , ]
  10. >>> c = zip(a, b)
  11. >>> c
  12. <zip object at 0x0000000003728908>
  13. >>> list(c)
  14. [(, ), (, ), (, )]

同样,python3采用了惰性求值的思路

enumerate()函数:

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

例:

  1. >>>i =
  2. >>> seq = ['one', 'two', 'three']
  3. >>> for element in seq:
  4. ... print i, seq[i]
  5. ... i +=
  6. ...
  7. one
  8. two
  9. thre

6.列表推导式

例:

  1. >>> a = [x*x for x in range()]
  2. >>> a
  3. [, , , , , , , , , ]

前面的x*x可以换成任何函数

当然也可以加入嵌套循环和条件判定

例:

  1. >>> [(x, y) for x in range() for y in range()]
  2. [(, ), (, ), (, ), (, ), (, ), (, ), (, ), (, ), (, )]
  3.  
  4. >>> [(x, y) for x in [, , ] for y in [, , ] if x != y]
  5. [(, ), (, ), (, ), (, ), (, ), (, ), (, )]

 元组

这里大概注意两点

一个是关于解包问题

首先是字典和元组的解包:

  1. >>> a=(,,)
  2. >>> b,c,d=a
  3. >>> b
  4.  
  5. >>> c
  6.  
  7. >>> d
  8.  
  9. >>> a={'a':,'b':,'c':}
  10. >>> x,y,z=a
  11. >>> a
  12. {'a': , 'b': , 'c': }
  13. >>> x
  14. 'a'
  15. >>> y
  16. 'b'
  17. >>> z
  18. 'c'

作为参数传参时会使用到*,这里给出例子:

列表解包时,保持列表项数与参数数一致

  1. #解包--list,元组,集合
  2. def connect(ip,port,username,password):
  3. print(ip)
  4. print(port)
  5. print(username)
  6. print(password)
  7.  
  8. info_list=['192.168.1.1',,'zhaozhao','']
  9. info_tuple=('192.168.1.1',,'zhaozhao','')
  10. info_set={'192.168.1.1',,'zhaozhao',''}
  11.  
  12. connect(*info_list)
  13. connect(*info_tuple)
  14. connect(*info_set)

字典解包时,使用两个**代表对值的解包,但需要参数名称和key的值一样:

  1. dic={"name":"zhaozhao","password":""}
  2.  
  3. def dic_fun(name,password):
  4. print(name)
  5. print(password)
  6.  
  7. dic_fun(**dic)
  1. zhaozhao
  2. 123456
  1.  

第二个是关于生成器推导式

生成器推导式和列表推导式相近,不过与列表推导式不同的是,生成器推导式的结果是一个生成器对象,而不是列表,也不是元组。使用生成器对象的元素时,可以根据需要将其转化为列表或元组,也可以使用生成器对象的next()方法(Python 2.x)或__next__()方法(Python 3.x)进行遍历,或者直接将其作为迭代器对象来使用

  1. >>> g=((i+)** for i in range())
  2. >>> g
  3. <generator object <genexpr> at 0x02B15C60>
  4. >>>tuple(g)
  5. (, , , , , , , , , )
  6. >>> tuple(g)
  7. ()
  8. >>> g=((i+)** for i in range())
  9. >>> g.next() #在python 3中应改为__next__()
  10.  
  11. >>> g.next()
  12.  
  13. >>> g.next()
  14.  
  15. >>> g.next()

注意这个生成器推导式产生的对象的一个特点:一次性,如在变成一个元组后,生成的可迭代对象就变成了空值,这个和前面python3中range函数和zip函数以及map函数返回的值相近,也就是惰性求值的思想。

字典

字典其实一直是我比较烦的地方了,,,,这里借用我们老师的话对之进行一个概述

字典是键值对(key-value pair)的无序可变集合
定义字典时,每个元素的键和值用冒号分隔,元素之间用逗号分隔,所有的元素放在一对大括号{ 和 }中
字典中的每个元素包含两部分:键和值,向字典添加一个键的同时,必须为该键增添一个值
字典中的键可以为任意不可变对象,比如整数、实数、复数、字符串、元组等等
字典中的键不允许重复

这里索性就把所有关于字典的东西整理一下吧

字典的创建

  1. #创建空字典1
  2.  
  3. d = {}
  4. print(d)
  5.  
  6. #创建空字典2
  7. d = dict()
  8.  
  9. #直接赋值方式
  10.  
  11. d = {"one":,"two":,"three":,"four":}
  12.  
  13. #常规字典生成式
  14.  
  15. dd = {k:v for k,v in d.items()}
  16. print(dd)
  17.  
  18. #加限制条件的字典生成方式
  19.  
  20. ddd = {k:v for k,v in d.items() if v % ==}
  21. print(ddd)

访问、删除和变更

  1. #访问字典中的数据
  2. d = {"one":,"two":,"three":,"four":}
  3. print(d["one"])
  4. #变更字典里面的数据
  5. d["one"] = "eins"
  6. print(d)
  7.  
  8. #删除一个数据,使用del
  9. del d["one"]
  10. print(d)
  11.  
  12. #运行结果如下:
  13. {'one': 'eins', 'two': , 'three': , 'four': }
  14. {'two': , 'three': , 'four': }

还有几点:

使用字典对象的get方法获取指定键对应的值,并且可以在键不存在的时候返回指定值。如不指定,默认返回None

在Python 2.7中:
使用字典对象的items()方法可以返回字典的键、值对列表
使用字典对象的keys()方法可以返回字典的键列表
使用字典对象的values()方法可以返回字典的值列表

python3中以上几个函数返回的不再是列表,为一个可迭代的视图对象

  1. #python3
    >>> d=dict(zip(('e','r'),(,)))
  2. >>> d.keys()
  3. dict_keys(['e', 'r'])
  4. >>> d.values()
  5. dict_values([, ])
  6. >>> d.items()
  7. dict_items([('e', ), ('r', )])

深入理解python(二)python基础知识之数据结构的更多相关文章

  1. Python开发(一):Python介绍与基础知识

    Python开发(一):Python介绍与基础知识 本次内容 一:Python介绍: 二:Python是一门什么语言 三:Python:安装 四:第一个程序 “Hello world” 五:Pytho ...

  2. Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现

    Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现 一丶进程基础知识 什么是程序: ​   程序就是一堆文件 什么是进程: ​   进程就是一个正在 ...

  3. Python第一章-基础知识

    第一章:基础知识 1.1 安装python.     直接官网下载最新的python然后默认安装就可以了,然后开始菜单里找到pyhton *.*.* Shell.exe运行python的交互shell ...

  4. 基于Python的Flask基础知识

    Flask简介 Flask 是一个使用 Python 编写的轻量级 Web 应用程序框架.Armin Ronacher带领一个名为Pocco的国际Python爱好者团队开发了Flask. 下面我们简单 ...

  5. Python音频处理基础知识,这不是轻轻松松~~~

    大家好鸭,我是小熊猫 咱今天来讲一讲音频处理的基础知识上才艺~~~ 1.声音的基础 2.python读取.wav音频 欢迎加入白嫖Q群:660193417### import wave import ...

  6. python这不是有手就行?——python音频处理基础知识

    大家应该都知道声音的基础吧? 啊不知道当我没说吧~~~ 1.声音的基础 2.python读取.wav音频 Python学习交流Q群:660193417#### import wave import s ...

  7. python第一课--基础知识

    python简介 Python是一种计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的 ...

  8. 爬虫基础---HTTP协议理解、网页的基础知识、爬虫的基本原理

    一.HTTP协议的理解 URL和URI 在学习HTTP之前我们需要了解一下URL.URI(精确的说明某资源的位置以及如果去访问它) URL:Universal Resource Locator 统一资 ...

  9. ERP-非财务人员的财务培训教(一.二)------财务基础知识

    二.基本财务管理知识 第一节 财务管理基础知识(一) 财务与会计的关系 会计的基础知识 (一) 财务与会计的关系 财务与会计的内涵 1.会计 会计工作主要是解决三个环节的问题: 会计凭证 会计账簿 会 ...

  10. VBS学习日记(二) 基础知识

    VBScript 基础知识 一.变量 1.全部单引號后面的内容都被解释为凝视.(在vbsedit中ctrl+m凝视,反凝视ctrl+shift+m) 2.在 VBScript 中,变量的命名规则遵循标 ...

随机推荐

  1. QGridLayout栅格布局函数参数设置

    对于PyQt5的栅格布局函数,主要是实现多个控件之间的栅格布局形式,一般有两种设置方式: 1.Qdesigner布局设置时直接使用栅格布局函数,便可以把所需要布局的控件直接按照栅格方式来进行布局: 2 ...

  2. 吴裕雄 python 神经网络——TensorFlow训练神经网络:不使用正则化

    import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data INPUT_NODE = 784 ...

  3. java中静态初始化块的执行顺序

    在java中,其应该是先于所有的方法执行. 下面是测试代码: public class Test1 { static{ System.out.println("执行静态初始化块test1.. ...

  4. java中关于类和对象的一些思考

    就这个问题而言 第一种和第二种定义的变量并不是一种形式 前者我们称为原始数据变量 后者我们称为对象变量 这两种变量的创建方式,定义方式,使用方式都有着很多不同 需要引起注意. 在java中,有着基本的 ...

  5. C++中的sort函数和⾃定义cmp函数

    写在最前面,本文摘录于柳神笔记: sort 函数在头⽂件 #include ⾥⾯,主要是对⼀个数组进⾏排序( int arr[] 数组或 者 vector 数组都⾏), vector 是容器,要⽤ v ...

  6. Codeforces Round #617 (Div. 3)

    A 题意:能否将数组里面的值用数组里面的值替换出一个和为奇数的数组 思路:1.和为奇数yes 2.和为偶数但有奇数yes 3.个数是奇数的,有奇数的yes 其他都是no 果然罚时全给了A #inclu ...

  7. nyoj 57

    6174问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替 ...

  8. 【NGINX】LINUX安装NGINX

    安装依赖() · yum install gcc · yum install pcre-devel · yum install zlib zlib-devel · yum install openss ...

  9. unity优化-GPU(网上整理)

    优化-GPUGPU与CPU不同,所以侧重点自然也不一样.GPU的瓶颈主要存在在如下的方面: 填充率,可以简单的理解为图形处理单元每秒渲染的像素数量.像素的复杂度,比如动态阴影,光照,复杂的shader ...

  10. centOS+DJango+mysql_nginx部署流程记录

    安装Python3.6.2: https://www.jianshu.com/p/7a76bcc401a1 安装MySQL: https://www.cnblogs.com/luohanguo/p/9 ...