zoukankan      html  css  js  c++  java
  • python学习笔记3核心类型列表

    列表和字典,这两种类型几乎是Python所有脚本的主要工作组件。他们都可以在原处进行修改,可以按需求增加或缩短,
    而且包含任何种类的对象或者被嵌套。

    一、列表
    列表的主要属性:
    *任意对象的有序集合
    从功能上看,列表就是收集其他对象的地方,可以把它看作组。列表所包含每一项都保持了从左到右的位置顺序(它们是序列)
    *通过偏移读取
    和字符串一样,可以通过列表对象的偏移对其进行索引,从而读取对象的某一部分内容。可以自行分片和合并之类的任务。
    *可变长度,异构以及任意嵌套
    列表可以实地增长或者缩短,并且可以包含任何类型的对象。支持任意的嵌套,可以创建列表的子列表的子列表。
    *属于可变序列的分类
    列表可以在原处修改。序列操作在列表与字符串中的工作方式相同。唯一的区别是:当合并和分片这样的操作当应用于列表时,
    返回新的列表而不是新的字符串。然而列表是可变的,因为它们支持字符串不支持的其他操作,例如删除和索引赋值操作。
    它们都是在原处修改列表。
    *对象引用数组
    列表包含了0或多个其他对象的引用。在Python解释器内部,列表就是C数组而不是链接结构。包含任何对象,对象可以是字典,
    也就是说可以嵌套字典。
    长剑的具有代表性的列表操作。更多可以查阅Python的标准库或运行help(list)或dir(list)查看list方法的完整列表清单。

    操作 解释
    L1=[] 一个空的列表
    L2=[0,1,2,3] 四项:索引0到3
    L3=['abc',['def','ghi']] 嵌套的子列表
    L2[i] 索引
    L2[i][j] 索引的索引
    L2[i:j] 分片
    L2[i:j:l] 分片,步进为l
    len(L2) 求长度
    L1+l2 合并
    L2* 重复
    for x in L2 迭代
    3 in L2 成员
    L2.append(4) 方法:增加 增加单个对象
    L2.extend([5,6,7]) 方法:增加对个对象
    L2.sort() 方法:排序
    L3.index('abc') 方法:通过对象查找对象索引(和索引相反的操作)
    L2.insert(I,X) 方法:插入(在I位置插入X)
    L2.reverse() 方法:翻转
    L2.remove('b') 方法:移除 方法的参数 填写的对象
    L2.pop(1) 方法:移除 方法的参数填写的是索引
    del L2[K] 裁剪:k为裁剪掉的索引
    del L2[i:j] 裁剪:
    L2[i]=1 索引赋值
    L2[i:j]=[4,5,6] 分片赋值
    rang(4) 生成整数列表/元组
    xrange(1,4)
    L4=[x**2 for x in range(5)] 列表解析

    二、实际应用中的列表
    1、列表的创建和修改
    1)创建
    直接创建
    >>> aList=[123,'abc',4.56,['inner','list']]
    >>> blist=[None,'some things']
    使用工厂函数创建
    >>> cList=list('jin')
    2)修改
    >>> aList[2]=['bcd']
    >>> aList
    [123, 'abc', 'bcd', ['inner', 'list']]
    >>> aList[3][0]='out'
    >>> aList
    [123, 'abc', 'bcd', ['out', 'list']]
    2、基本列表操作
    合并和重复,和字符串基本一致,不过结果是一个新的列表,而不是一个字符串。
    >>> len([1,2,3])
    3
    >>> [1,2,3]+[4,5,6]
    [1, 2, 3, 4, 5, 6]
    >>> ['diege',18]*3
    ['diege', 18, 'diege', 18, 'diege', 18]
    >>> 3 in [1,2,3]
    True
    >>> for x in [1,2,3]:print x,
    ...
    1 2 3
    注意“+”操作和字符串中的一样,然而值得重视的时"+"两边必须是相同类型的序列。不能将一个列表和一个字符串合并
    到一起,除非先把列表转换为字符串。

    >>> str([1,2]) + '34'
    '[1, 2]34'
    >>> [1,2]+list('34')
    [1, 2, '3', '4']
    3、索引,分片,矩阵
    对列表进行索引的结果就是你指定的偏移处的对象(不管是什么类型),而对列表进行分片时往往返回一个新的列表
    >>> L=['diege','lily','keylly']
    >>> L[1]
    'lily'
    >>> L[-1]
    'keylly'
    >>> L[1:]
    ['lily', 'keylly']
    >>> LL=[[1,2,3],[4,5,6],[7,8,9]]
    >>> LL[2]
    [7, 8, 9]
    >>> LL[1][2]
    6
    三、原处修改列表
    列表可变,支持实地改变列表对象的操作,以下操作都可以直接修改列表对象,而不会像字符串那样强迫你建立一个新的拷贝。
    因为python只处理对象引用,所以需要将原处修改一个对象与生成一个新的对象区分开来。

    1、索引和分片赋值
    赋值给一个特定的项(偏移)或整个片段(分片)来改变列表的内容。
    >>> L=['diege','lily','keylly']
    >>> L[1]='tom'
    >>> L
    ['diege', 'tom', 'keylly']
    >>> L[0:2]=['boo','july']
    >>> L
    ['boo', 'july', 'keylly']
    分片赋值可以分成两步来理解。先删除,再插入。
    嵌套字典
    >>> L
    ['diege', {'tow': 789, 'one': 456}, 999]
    >>> L[1]
    {'tow': 789, 'one': 456}
    >>> L[1]['one']
    456

    2、列表方法调用
    1)、append() 追加
    >>> L
    ['boo', 'july', 'keylly']
    >>> L.append('jun')
    >>> L
    ['boo', 'july', 'keylly', 'jun']
    2)、extend() 在末端插入多个元素
    >>> L=[1,2]
    >>> L.extend([3,4,5])
    >>> L
    [1, 2, 3, 4, 5]
    3)、insert() 插入 要指定插入的位置和数据
    >>> L.insert(1,5)
    >>> L
    [1, 5, 4]
    >>> L.insert(2,[6,7,9])
    >>> L
    [1, 5, [6, 7, 9], 4]
    4)、pop() 删除一个元素,参数为索引并返回删除的对象
    pop() 方法:移除 方法的参数填写的是索引,默认最后一个
    >>> L
    [1, 2, 3, 4, 5]
    >>> L.pop()
    5
    #返回删除的对象
    >>> L
    [1, 2, 3, 4]
    可以指定要删除的索引
    >>> L.pop(2)
    3
    >>> L
    [1, 2, 4]
    5)、remove() 移除 必须指定对象 无返回
    >>> L.remove(2)
    >>> L
    [1, 4]
    6)、sort() 排序
    >>> L.sort()
    >>> L
    ['boo', 'july', 'jun', 'keylly']
    7)、reverse() 序列反转
    >>> L.reverse()
    >>> L
    ['keylly', 'jun', 'july', 'boo']
    8)计算列表中元素的个数
    >>> L
    [0, 8, 1, 2, 3, 4, 5, 6, 7, 8]
    >>> L.count(8)
    2

    3、其他常见的列表操作
    del L[1]
    >>> L
    [1, 5, [6, 7, 9], 4]
    >>> del L[1]
    >>> L
    [1, [6, 7, 9], 4]
    >>> del L[1:]
    >>> L
    [1]
    >>> L=['diege',1,5]
    >>> L[1:]=[]
    >>> L
    ['diege']
    >>> del L 删除整个列表对象

    【【核心编程新整理】】
    一、列表标准类型操作符
    >>> list1 = ['abc', 123]
    >>> list2 = ['xyz', 789]
    >>> list3 = ['abc', 123]
    >>> 1ist1 < list2
    True
    >>> list2 < list3
    False
    >>> list2
    在使用比较操作符时,比较数字和字符串是很明了的,但是用在列表上时就不是那么简单了,
    列表比较操作有些狡猾,但是合乎逻辑.比较列表时也是用的内建的cmp()函数,【基本的比较逻辑
    是这样的:两个列表的元素分别比较,直到有一方的元素胜出。】

    二、序列操作符
    1、切片 [] [:] [::]
    2、成员关系操作( in ,not in)
    3、连接接操作符( + )
    4、重复操作符( * )
    5、列表类型操作符和列表解析
    其实Python 中没有专门用于列表类型的操作符.列表可以使用大部分的对象和序列类型的
    操作符.

    三、内建函数
    (一)、标准内建函数
    type()
    cmp()
    str()
    isinstance()

    (二)序列类型操作符
    序列操作符 作用
    seq[ind] 获得下标为ind 的元素
    seq[ind1:ind2] 获得下标从ind1 到ind2 间的元素集合
    seq * expr 序列重复expr 次
    seq1 + seq2 连接序列seq1 和seq2
    obj in seq 判断obj 元素是否包含在seq 中
    obj not in seq 判断obj 元素是否不包含在seq 中

    1、成员关系 in,not in
    对象 [not] in 序列

    2、连接操作符(+)
    sequence1+sequence2

    3、重复操作符(*)
    sequence*int
    int必须是一个整数,而且不能使长整数

    4、切片操作符[][N][n:m][:][::][n:m:l]

    5、使用步长来进行扩展切片[n:m:l]
    s='abcded'
    s[::-1] 类似翻转
    s[::2] 隔一个取一个
    6、切片索引的更多内容
    切片索引的语法要比简单的单一元素索引灵活的多。开始和结束素引值可以超过字符串的
    长度。换句话说,起始索引可以小于0,而对于结束索引,即使索引值为100 的元素并不存在也
    不会报错
    有一个字符串,我们想通过一个循环按照这样的形式显示它:每次都把
    位于最后的一个字符砍掉,下面是实现这个要求的一种方法:
    >>> s = 'abcde'
    >>> for i in range(-1, -len(s), -1):#-1,-len(s)倒数,步进在-1 有正数
    ... print s[:i]
    ...

    (三)、序列类型函数[不是对象的方法是函数]
    1)列表求长:len(L)
    2)列表中的最大值最小值: max(L)和min(L)
    max()和min()函数在字符串操作里面用处不大,因为它们能对字符串做的只能是找出
    串中"最大"和"最小"的字符(按词典序),而对列表和元组来说,它们被定义了更多的用处.比如
    对只包含数字和字符串对象的列表,max()和min()函数就非常有用,重申一遍,混合对象的结构
    越复杂返回的结构准确性就越差
    3)正向排序和反向排序:sorted(L) reversed(L)
    没有这连个属性?????不是对象的方法是函数
    >>> s = ['They', 'stamp', 'them', 'when', "they're", 'small']
    >>> for t in reversed(s):
    ... print t,
    ...
    small they're when them stamp They
    >>> sorted(s)
    ['They', 'small', 'stamp', 'them', "they're", 'when']
    4)enumerate() 索引和item组成个元组
    enumerate() 接受一个可迭代对象作为参数,返回一个enumerate 对象(同时也是一个迭代器),该对象生成由iter 每个元素的index 值和item值组成的元组
    >>> for i,v in enumerate(L):
    ... print i,v
    ...
    0 d
    1 a
    2 c
    5)zip() 对多个列表内容进行组合
    返回一个列表,其第一个元素是it0,it1,...这些元素的第一个元素组成的一个元组,第二个...,类推.
    >>> fn = ['ian', 'stuart', 'david']
    >>> ln = ['bairnson', 'elliott', 'paton']
    >>> for i, j in zip(fn, ln):
    ... print i,j
    ...
    ian bairnson
    stuart elliott
    david paton
    >>> for i, j in zip(fn, ln):
    ... print ('%s %s' % (i,j)).title()
    ...
    Ian Bairnson
    Stuart Elli
    ('%s %s' % (i,j)).title()???
    ('%s %s' % (i,j)) 组成一字符串
    title() 这个字符串中单词第一个字母大写
    6)sum() 列表求和
    >>> a = [6, 4, 5]
    >>> reduce(operator.add, a)
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    NameError: name 'operator' is not defined
    >>> import operator
    >>> reduce(operator.add, a)
    15
    >>> sum(a)
    15
    >>> sum(a, 5)
    20
    >>> a = [6., 4., 5.]
    >>> sum(a)
    15.0

    五.【列表类型的内建函数】列表的方法
    Python 中的列表类型有自己的方法
    用点号的方式访问对象的属性:object.attribute.列表的
    方法也是这样:list.method().我们用点号来访问一个对象的属性(在这里是一个函数),然后用
    函数操作符( () )来调用这个方法.
    我们可以在一个列表对象上应用dir()方法来得到它所有的方法和属性:
    dir(list) # or dir([])

    List Method Operation
    list.append(obj) 向列表中添加一个对象obj
    list.count(obj) 返回一个对象obj 在列表中出现的次数
    list.extend(seq)a 把序列seq 的内容添加到列表中
    list.index(obj, i=0,
    j=len(list)) 返回list[k] == obj 的k 值,并且k 的范围在 i<=k<j;否则
    引发ValueError 异常.
    list.insert(index, obj) 在索引量为index 的位置插入对象obj.
    list.pop(index=-1)a 删除并返回指定位置的对象,默认是最后一个对象
    list.remove(obj) 从列表中删除对象obj
    list.reverse() 原地翻转列表
    list.sort(func=None,key=None,reverse=False)b 以指定的方式排序列表中的成员,如果func 和key参数指定,则按照指定的方式比较各个元素,如果reverse 标志被置为
    True,则列表以反序排列.

    在使用可变对象的方法如sort(),extend()和reverse()的时候要注意,这些操作会在列表
    中原地执行操作,也就是说现有的列表内容会被改变,但是没有返回值!是的,与之相反,字符串
    方法确实有返回值:
    >>> 'leanna, silly girl!'.upper()
    'LEANNA, SILLY GIRL!'
    温习一下,字符串是不可变的 -- 不可变对象的方法是不能改变它们的值的,所以它们必须
    返回一个新的对象.如果你确实需要返回一个对象,那么我们建议你看一下Python2.4 以后加入
    的reversed()和sorted()内建函数.
    它们像列表的方法一样工作,不同的是它们可以用做表达式,因为它们返回一个对象.同时
    原来的那个列表还是那个列表,没有改变,而你得到的是一个新的对象.
    表达式有返回值

    六、列表的特殊性
    1、用列表构建其他数据结构
    堆栈 【后进先出(LIFO)的数据结构】
    堆栈是一个后进先出(LIFO)的数据结构,其工作方式就像自助餐厅里面用于放盘子的弹簧
    支架.把盘子想像成对象,第一个离开堆栈的是你最后放上的那个.在栈上"push"元素是个常用
    术语,意思是把一个对象添加到堆栈中.反之,要删除一个元素,你可以把它"pop"出堆栈,例6.3
    展示了一个菜单驱动的程序,它实现了一个简单的、用于存储字符串的堆栈.
    用列表模拟堆栈(stack.py)
    这个简单的脚本把列表做为堆栈用于存储和取回输入的字符串,这个菜单驱动驱动的程序
    仅使用了列表的append()和pop()方法.
    vi stack.py
    #!/bin/env python

    stack = []

    def pushit():
    stack.append(raw_input('Enter new string: ').strip())

    def popit():
    if len(stack) == 0:
    print 'Cannot pop from an empty stack!'
    else:
    print 'Removed [', stack.pop(), ']'

    def viewstack():
    print stack # calls str() internally

    CMDs = {'u': pushit, 'o': popit, 'v': viewstack}

    def showmenu():
    pr = """
    p(U)sh
    p(O)p
    (V)iew
    (Q)uit

    Enter choice:"""
    print pr

    while True:
    while True:
    try:
    choice = raw_input(pr).strip()[0].lower()
    except (EOFError,KeyboardInterrupt,IndexError):
    choice = 'q'

    print '\nYou picked: [%s]' % choice
    if choice not in 'uovq':
    print 'Invalid option, try again'
    else:
    break

    if choice == 'q':
    break
    CMDs[choice]()

    if __name__ == '__main__':
    showmenu()

    队列【队列是一种先进先出(FIFO)的数据类型】
    队列是一种先进先出(FIFO)的数据类型,它的工作原理类似于超市中排队交钱或者银行里
    面的排队,队列里的第一个人首先接受服务(
    满心想第一个出去).新的元素通过"入队"的方式添加进队列的末尾,"出队"就是从队列的
    头部删除.下面的例子里面展示了这种操作,我们把上面的堆栈的例子进行了改造,用列表实现
    了一个简单的队列.
    我们把列表用做队列来存储和取回菜单驱动应用里面输入的字符串,只用到了
    列表的append()和pop()方法.
    vi queue.py
    #!/bin/env python

    queue = []

    def enQ():
    queue.append(raw_input('Enter new string: ').strip())

    def deQ():
    if len(queue) == 0:
    print 'Cannot pop from an empty queue!'
    else:
    print 'Removed [', queue.pop(0), ']'

    def viewQ():
    print queue # calls str() internally

    CMDs = {'e': enQ, 'd': deQ, 'v': viewQ}

    def showmenu():
    pr = """
    (E)nqueue
    (D)equeue
    (V)iew
    (Q)uit

    Enter choice:"""

    while True:
    while True:
    try:
    choice = raw_input(pr).strip()[0].lower()
    except (EOFError,KeyboardInterrupt,IndexError):
    choice = 'q'

    print '\nYou picked: [%s]' % choice
    if choice not in 'devq':
    print 'Invalid option, try again'
    else:
    break

    if choice == 'q':
    break
    CMDs[choice]()

    if __name__ == '__main__':
    showmenu()

    七、列表解析
    >>> [ i * 2 for i in [8, -2, 5] ]
    [16, -4, 10]
    >>> [ i for i in range(8) if i % 2 == 0 ]
    [0, 2, 4, 6]

  • 相关阅读:
    Java——Math,Set,List,map相关练习
    Java——单例模式、多线程
    Java——I/O入门相关练习代码
    Java——I/O相关练习代码
    Java——序列化与反序列化
    python-selenium-粘贴,删除,复制和悬停
    Typora图床设置(阿里云版,图片自动上传)
    图书管理系统(Java实现,十个数据表,含源码、ER图,超详细报告解释,2020.7.11更新)
    openresty的安装和使用
    工具丨超好用的免费AWR分析工具
  • 原文地址:https://www.cnblogs.com/diege/p/2710483.html
Copyright © 2011-2022 走看看