本章将引入一个新的概念:数据结构。

数据结构是通过某种方式阻止在一起的数据元素的集合,这些数据元素可以是数字或者字符,设置可以是其他数据结构。

Python中,最基本的数据结构是序列(Sequence),序列中的每个元素被分配一个序列号--即元素的位置,也称为索引。第一个索引是0,第二个则是1,以此类推,倒数第一个是-1。

序列概览


   Python中包含6中内建的序列:列表、元组、字符串、Unicode字符串、buffer对象、xrange对象。本章节重点内容是:列表和元组

  列表和元组的主要区别在于:列表可以修改, 元组则不能。

   下面开始举例:

>>> example = [','b',3]
>>> example2 = ['test']
>>> test = [example,example2]
>>> test
    [[', 'b', 3], ['test']]

  上例是对列表进行赋值操作,列表是用[]来括起来的

通用序列操作


   常用的操作包括:索引(indexing)、分片(sliceing)、加(adding)、乘(multiplying)以及检查某个元素是否属于序列的成员。除此之外,Python还有计算序列长度,找出最大元素和最小元素的内建函数。

  1. 索引
    序列中的所有元素都是有编号的(从0开始递增,0指向第一个元素),示例如下:

    >>> test = 'hello'
    >>> test[0]
    'h'

    下面再例举一个代码实例:

    #define months
    months = [
        'Jan',
        'Feb',
        'Mar',
        'Apr',
        'May',
        'Jun',
        'Jul',
        'Aug',
        'Sep',
        'Oct',
        'Nov',
        'Dec'
        ]
    #define day's endings
    endings = ['st','nd','rd'] + 17*['th']\
            + ['st','nd','rd'] + 7*['th']\
            + ['st']
    year = raw_input('Year:')
    month = raw_input('Month(1-12):')
    day = raw_input('Day(1-31):')
    
    month_number = int(month)
    day_number = int(day)
    
    month_name = months[month_number - 1]
    day_name = day + endings[day_number - 1]
    
    print month_name +' '+ day_name + ',' + year

    输出结果:

    Year:2013
    Month(1-12):12
    Day(1-31):26
    Dec 26th,2013
  2. 分片
    先示例:
    >>> a = [,,,,,,,,,]
    >>> a[:]
        [, , , ]

    结合上例,根据上节索引内容可知,分片操作的实现需要提供至少两个索引作为边界,第一个索引的元素是包含在元素分片内的,而第二个则不包含在分片内。

    下面再例举几个实例:

    >>> a[-3:-1]
        [8, 9]
    >>> a[-3:]
        [8, 9, 10]
    >>> a[:]
        [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    更大的步长

    >>> a = [1,2,3,4,5,6,7,8,9,10]
    >>> a[1:9:2]
        [2, 4, 6, 8]
    >>> a[::2]
        [1, 3, 5, 7, 9]
    >>> a[::-2]
        [10, 8, 6, 4, 2]

    进行分片的时候,分片的开始和结束点需要进行指定,而另一个参数 - 步长(step length),通常都是隐式设置的。在普通的分片中,默认步长是1,分片操作就是按照这个步长逐步遍历序列的元素,然后返回开始喝结束点之间的所有元素。

    如果步长是负数,那么就会从右往左提取元素。

  3. 序列相加
    只有两种相同类型的序列才能进行连接操作
    >>> a = [1,2]
    >>> b = [3,4]
    >>> a + b
        [1, 2, 3, 4]
  4. 乘法
    用数字x诚意一个序列会生成新的序列,而在新的序列中,原来的序列会被重复x次,示例如下:
    >>> 'Python'*5
        'PythonPythonPythonPythonPython'
    >>> [5]*5
        [5, 5, 5, 5, 5]

    下面举一个复杂一点的乘法示例:用程序在屏幕上打印一个由字符组成的“盒子”,而这个“盒子”在屏幕上居中,而且能根据用户输入的句子自动调整大小:

    sentence = raw_input('please input the sentence:')
    screen_width = 80
    text_width = len(sentence)
    box_width = text_width +6
    left_margin = (screen_width - box_width)//2
    
    print
    print ' '*left_margin + '+' + '-'*(box_width-2) + '+'
    print ' '*left_margin + '|' + ' '*(box_width-2) + '|'
    print ' '*left_margin + '|' + sentence + ' '*(box_width-2-text_width) + '|'
    print ' '*left_margin + '|' + ' '*(box_width-2) + '|'
    print ' '*left_margin + '+' + '-'*(box_width-2) + '+'
    print

    输出结果如下:

    please input the sentence:Python
    
                                      +----------+
                                      |          |
                                      |Python    |
                                      |          |
                                      +----------+

    None、空列表和初始化

    空列表可以简单地通过两个中括号进行表示([])。
    None是一个Python的内建值,它的确切含义是“这里什么也没有”,因此,如果想初始化一个长度为10的列表,可以按照下面的例子:

    >>> sequence = [None]*10
    >>> sequence
        [None, None, None, None, None, None, None, None, None, None]

    注意None的首字母大写

  5. 成员资格
    为了检查一个值是否在序列中,可以使用 in 运算符。示例如下:
    >>> p = [2,3]
    >>> 2 in p
        True
    >>> x = 'Python'
    >>> 'm' in x
        False
  6. 长度、最小值 和 最大值
    内建函数len(长度),min(最小值)和max(最大值)。
    示例如下:
    >>> python = [1,2,3,4,5]
    >>> len(python)
        5
    >>> max(python)
        5
    >>> min(python)
        1

列表


  上面的例子已经用了很多次列表,下面将会讨论列表不同于元素和字符串的地方:列表时可变的(mutable)——可以改变列表的内容,并且列表有很多有用的、专门的方法。

  1. list函数
    因为字符串不能像列表那样被修改,所以有时根据字符串创建列表会很有用,而list函数可以实现这个操作:

    >>> list('Python')
        ['P', 'y', 't', 'h', 'o', 'n']

    list函数适用于所有类型的序列,而不只是字符串

  2. 基本的列表操作
    ①改变列表:元素赋值
    >>> a = [,,]
    >>> a[] =
    >>> a
        [, , ]

    ②删除元素

    >>> test = ['a','b','c','d']
    >>> del test[2]
    >>> test
    ['a', 'b', 'd']

    ③分片赋值
    先示例:

    >>> name = list('python')
    >>> name[1:] = 'wm'
    >>> name
    ['p', 'w', 'm']
    
    >>> names = list('english')
    >>> names[1:3] = 'tt'
    >>> names
    ['e', 't', 't', 'l', 'i', 's', 'h']

    分片赋值语句可以在不需要替换任何原有元素的情况下插入新的元素:

    >>> a = [']
    >>> a[1:1] = 'test'
    >>> a
    [']
  3. 列表方法
    方法是一个与某些对象有紧密联系的函数,对象可能是列表、数字。也可能是字符串或者其他类型的对象。一般来说,方法可以这样进行调用:
    对象.方法(参数)

    ① append
    append方法用于在列表末尾追加新的对象:

    >>> a = [1,2,3]
    >>> a.append(4)
    >>> a
    [1, 2, 3, 4]

    ② count
    count方法统计某个元素在列表出现的次数

    >>> test = [1,'a','a',[1,2],[1,[1,2]]]
    >>> test.count(1)
    1
    >>> test.count('a')
    2
    >>> test.count([1,2])
    1

    ③ extend
    extend方法可以在列表的末尾一次性追加另一个序列中的多个值。换句话说,可以用新列表扩展原有的列表:

    >>> a = [1,2,3]
    >>> b = [4,5,6]
    >>> a.extend(b)
    >>> a
    [1, 2, 3, 4, 5, 6]

    和连接操作,赋值操作对比

    >>> a = [1,2,3]
    >>> b = [4,5,6]
    >>> a+b
    [1, 2, 3, 4, 5, 6]
    >>> a
    [1, 2, 3]
    >>> a = a + b #赋值操作
    >>> a
    [1, 2, 3, 4, 5, 6]

    ④ index
    index方法用于从列表中找出某个值第一个匹配项的索引位置:

    >>> a = ['a','b','c','d']
    >>> a.index('c')
    2

    当索引中寻找的匹配项找不到,系统就会报错

    ⑤ insert
    insert方法用于将对象插入到列表中:

    >>> a = [1,2,3,4,5]
    >>> a.insert(3,'Python')
    >>> a
    [1, 2, 3, 'Python', 4, 5]

    ⑥ pop
    pop方法会移除列表中的一个元素(默认是最后一个),并返回该元素的值:

    >>> a = [1,2,3]
    >>> a.pop()
    3
    >>> a
    [1, 2]

    ⑦ remove

    remove方法用于移除列表中某个值第一个匹配项

    >>> a = [1,2,3,1]
    >>> a.remove(1)
    >>> a
    [2, 3, 1]

    ⑧ reverse
    reverse方法将列表中的元素方向存放

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

    ⑨ sort
    sort方法用于在原位置对列表进行排序。在“原位置排序”意味着改变原来的列表,从而让其中的元素能按一定的顺序排列,而不是简单地返回一个已排序的列表副本。

    >>> x = [1,6,4,3,9,2]
    >>> x.sort()
    >>> x
    [1, 2, 3, 4, 6, 9]

  4. 元组

  元组与列表一样,也是一种序列。唯一的不同是元组不能修改。创建元组的语法很简单:
  

>>> 1,2,3
(1, 2, 3)
>>> (2,3,4)
(2, 3, 4)
>>> ()
()

  ①tuple函数

  tuple函数的功能与list函数基本是一样的:以一个序列作为参数并把它转换为元组。如果参数是元组,那么该参数就会被原样返回:

    

>>> tuple([1,2,3])
(1, 2, 3)
>>> tuple('abc')
('a', 'b', 'c')
>>> tuple((1,2))
(1, 2)

  ②基本元组操作和序列类似

  

  ③元组的意义

  • 元组可以在映射中当做键来使用,而列表不行
  • 元组作为很多内建函数和方法的返回值存在,也就是说你必须对元组进行处理。

小结


  • 序列:序列是一种数据结构,它包含的元素都进行了编号(从0开始)。典型的序列包括:列表、字符串和元组。
  • 成员资格:in操作符
  • 方法:现在主要是一些内建的函数

(加快自己的节奏,最近又贪玩了,呵呵下自己)

《Python基础教程(第二版)》学习笔记 -> 第二章 列表和元组的更多相关文章

  1. <<Python基础教程>>学习笔记 | 第04章 | 字典

    第04章:字典 当索引不好用时 Python唯一的内建的映射类型,无序,但都存储在一个特定的键中.键能够使字符.数字.或者是元祖. ------ 字典使用: 表征游戏棋盘的状态,每一个键都是由坐标值组 ...

  2. <<Python基础教程>>学习笔记 | 第10章 | 充电时刻

    第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简 ...

  3. <<Python基础教程>>学习笔记 | 第12章 | 图形用户界面

    Python支持的工具包非常多.但没有一个被觉得标准的工具包.用户选择的自由度大些.本章主要介绍最成熟的跨平台工具包wxPython.官方文档: http://wxpython.org/ ------ ...

  4. <<Python基础教程>>学习笔记 | 第11章 | 文件和素材

    打开文件 open(name[mode[,buffing]) name: 是强制选项,模式和缓冲是可选的 #假设文件不在.会报以下错误: >>> f = open(r'D:\text ...

  5. python cookbook第三版学习笔记三:列表以及字符串

    过滤序列元素: 有一个序列,想从其中过滤出想要的元素.最常用的办法就是列表过滤:比如下面的形式:这个表达式的意义是从1000个随机数中选出大于400的数据 test=[] for i in range ...

  6. Docker技术入门与实战 第二版-学习笔记-10-Docker Machine 项目-2-driver

    1>使用的driver 1〉generic 使用带有SSH的现有VM/主机创建机器. 如果你使用的是机器不直接支持的provider,或者希望导入现有主机以允许Docker Machine进行管 ...

  7. Docker技术入门与实战 第二版-学习笔记-8-网络功能network-3-容器访问控制和自定义网桥

    1)容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables防火墙来进行管理和实现. iptables是 Linux 上默认的防火墙软件,在大部分发行版中都自带. 容器访问外部网络 ...

  8. python学习笔记之一:列表与元组

    最近在看<python基础教程>(基于python2.x),下面总结一下第二章列表与元组的知识: 在这章中引入了数据结构的概念.数据结构是通过某种方式组织在一起的数据元素的集合.在pyth ...

  9. 锋利的jquery第二版学习笔记

    jquery系统学习笔记 一.初识:jquery的优势:1.轻量级(压缩后不到30KB)2.强大的选择器(支持css1.css2选择器的全部 css3的大部分 以及一些独创的 加入插件的话还可支持XP ...

  10. python cookbook第三版学习笔记十:类和对象(一)

    类和对象: 我们经常会对打印一个对象来得到对象的某些信息. class pair:     def __init__(self,x,y):         self.x=x         self. ...

随机推荐

  1. 利用JQuery的$.ajax()可以很方便的调用asp.net的后台方法

    利用JQuery的$.ajax()可以很方便的调用asp.net的后台方法. 先来个简单的实例热热身吧. 1.无参数的方法调用 asp.net code: view plaincopy to clip ...

  2. C# Windows - ListBox&CheckedListBox

    ListBox和CheckedListBox类的属性 属性 说明 SelectedIndex 这个值表明列表框中选中项的基于0的索引 ColumnWidth 在包含多个列的列表框中,这个属性指定列宽 ...

  3. 使用Yeoman搭建 AngularJS 应用 (12) —— 让我们搭建一个网页应用

    原文地址:http://yeoman.io/codelab/local-storage.html 安装Bower程序包 我们使用另一个Angular模块,"angular-local-sto ...

  4. PHP获取APP客户端的IP地址的方法

    分析php获取客户端ip 用php能获取客户端ip,这个大家都知道,代码如下: /** * 获取客户端ip * @param number $type * @return string */ func ...

  5. hdu 4294 Multiple

    思路: 首先给出一个结论,就是最多用两个数就可以表示任何数的倍数. 证明 :对于一个数字a,可以构造出的数字有 a,aa,aaa,aaaa,aaaaa,…… 每一个数对于n都有一个余数,余数最多有n个 ...

  6. [数论]ZOJ3593 One Person Game

    题意:一个人要从A走到B  只能走a布.b步.(a+b)步,可以往左或右走   问 最少要走几步,不能走到的输出-1 可以列出方程 $ax+by=A-B$ 或者 $ax+(a+b)y=A-B$ 或者 ...

  7. Qt:无标题栏无边框程序的拖动和改变大小

    From: http://blog.csdn.net/kfbyj/article/details/9284923 最近做项目遇到的问题,总结下. 有时候我们觉得系统的标题栏和按钮太丑太呆板,想做自己的 ...

  8. HDU1875——畅通工程再续(最小生成树:Kruskal算法)

    畅通工程再续 Description相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当 ...

  9. Android安全问题 钓鱼程序

    导读:文本介绍一种钓鱼应用,讲述如何骗取用户的用户名和密码,无须root 这个话题是继续android安全问题(二) 程序锁延伸的 之前我已经展示了如何制作程序锁.当打开指定应用的时候,弹出一个密码页 ...

  10. 使用SecureCRT上传和下载文件

    SecureCR 下的文件传输协议有ASCII .Xmodem .Ymodem .Zmodem.ASCII:这是最快的传输协议,但只能传送文本文件.Xmodem:这种传输协议速度较慢,但由于使用了CR ...