• 列表和元组


    2016-01-20

    1.1数据结构:数据结构是通过某种方式组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他的数据结构。

    1.2python中,最基本的数据结构是序列(sequence)。序列中的每个元素被分配一个序列号——即元素的位置,也称为索引。

    通用的序列操作

      所有的序列类型都可以进行某些特定的操作。这些操作包含:索引(index)、分片(slicing)、加(adding)、乘(multiplying)以及检查某个元素是否属于序列的成员(成员资格)。除此之外,python还有计算序列长度、找出某大元素的内建函数。

    索引示例:

    __author__ = 'Administrator'
    # 根据给定年月日以数字形式打印日期
    month = [
        'January','February','March','April'
        ,'May','June','July','August','September'
        ,'October','November','December'
    ]
    
    # 以1-31的数字作为结尾的列表
    endings = ['st','nd','rd']+17*['th']
            +['st','nd','rd']+7*['th']
            +['st']
    print(endings)
    
    # 输入年月日
    year  = input('Year: ')
    month = input('Month(1-12): ')
    day   = input('Day(1-31): ')
    
    month_number = int(month)
    day_number   = int(day)
    
    # 记得要将年份和天数减1,以获取正确的索引
    month_name = month[month_number-1]
    ordinal    = day+endings[day_number-1]
    
    # 打印结果
    print(month_name+' '+ordinal+','+year)
    

     输出结果如下:

    1.3 分片

      分片:分片通过冒号隔开的两个索引来实现(分片操作对于提取序列的一部分是很有用的)

      代码示例如下:

    numbers = [1,2,3,4,5,6,7,8,9,10]
    numbers[3:6]
    输出结果:[4,5,6]

      分片步长代码示例如下:

    1 #分片,包头不包尾
    2 numbers = [1,2,3,4,5,6,7,8,9,10]
    3 numbers[0:10:1]
    4 >>>[1,2,3,4,5,6,7,8,9,10]
    5 numbers[0:10:2]
    6 >>>[1,3,5,7,9]

    使用分片需注意:

    1、开始点的元素(最左边元素)包含在结果之中,而结束点的元素(最右边的元素)则不再分片之内。

    2、当使用一个负数作为步长时,必须让开始点(开始索引)大于结束点。

    1.4

      a)序列相加

      注意事项:列表和字符串是无法连接在一起的,只有两种相同类型的序列才能进行连接操作。

      b)序列乘法

      用数字x乘以一个序列会生成一个新的序列,而在新的序列中,原来的序列将被重复x次。

      序列(字符串)乘法示例

      

     1 # 以正确的宽度在剧中的“盒子”内打印一个句子
     2 # 注意,整数除法运算符(//)只能用在python 2.2以后的后续版本中,之前用的普通除法(/)
     3 
     4 # 输入要打印的字符串
     5 sentence = input("Sentence: ")
     6 
     7 # 设置盒子宽度和高度
     8 screen_width = 80
     9 text_width = len(sentence)
    10 # 取字符串长度为盒子宽度
    11 box_width = text_width + 6
    12 # 设置左边距
    13 left_margin = (screen_width-box_width)//2
    14 
    15 # 打印盒子
    16 print("
    ")
    17 print(' '*left_margin + '+'+'-'*(box_width-2)+'+')
    18 print(' '*(left_margin+2) + '|'+' '*(text_width) +'|')
    19 print(' '*(left_margin+2) + '|'+     sentence    +'|')
    20 print(' '*(left_margin+2) + '|'+' '*(text_width) +'|')
    21 print(' '*left_margin + '+'+'-'*(box_width-2)+'+')

    序列成员资格示例:

    1 database = [['jim','1234'],['tom','1234']]
    2 
    3 username = input('User name: ')
    4 pin = input('PIN code: ')
    5 
    6 if [username,pin] in database: print 'Access granted'

    2 列表:python的苦力

      列表与字符串不同的地方在于,列表是可变的——可以改变列表的内容。

    2.1   list函数

      list函数可以将字符串转换为列表,从而可以对该字符串进行修改。

    >>>list('Hello')
    >>>['H','e','l','l','o']

    2.2   基本的列表操作

      1.改变列表:元素赋值

      使用索引标记来为某个特定的、位置明确的元素赋值,如以下代码:

    >>>x = [1,1,1]
    >>>x[1] = 2
    >>>x
    [1,2,1]
    

       2.删除元素

       从列表中删除元素也很容易:使用del语句来实现。如以下代码:

    >>>names = ['jim','tom','jack']
    >>>del names[1]
    >>>names
    ['jim','jack']

      3.分片赋值

      分片赋值是一个非常强大的特性,分片赋值操作则更显它的强大。示例如下:

    #使用分片赋值时,可以使用与原序列不等长的序列将分片替换
    >>>name = list('Perl')
    >>>name[1:] = list(ython)
    >>>name
    ['P','y','t','h','o','n']
    
    #分片可以在不替换任何原有元素的情况下插入新的元素
    >>>numbers = [1,5]
    >>>numbers[1:1] = [2,3,4]
    >>>numbers
    [1,2,3,4,5]
    
    #分片也可用于删除元素
    >>>number[1:4] = []
    >>>number
    [1,5]

    2.3 列表方法

      1.append

      append方法用于在列表末尾追加新的对象:(示例如下)

    #append不是简单的返回一个修改过的列表——而是直接修改原来的列表
    >>>lst = [1,2,3]
    >>>lst.append(4)
    >>>lst
    [1,2,3,4]

      2.count

      ocunt方法统计某个元素在列表中出现的次数(示例如下)

    #统计元素出现的次数
    >>>x = [[1,2],1,1,[1,2,3]]
    >>>x.coung(1)
    2

      3.extend

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

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

      注意:这个操作看起来像是连接操作,两者最主要区别在于:extend方法修改了被扩展的序列(在这个例子中,就是a)。而原始的连接操作则不然,他会返回一个全新的列表。因此,链接操作的效率要比extend方法低。

      4.index

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

      5.insert

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

      6.pop

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

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

      注意:pop方法是唯一一个即能修改列表又返回元素值(除了None)的列表方法。

      使用pop方法可以实现一种常见的数据结构——栈。栈的原理:后进先出(这个原则称为LIFO)

      栈的两个操作:入栈(push)和出栈(pop),python中没有入栈的方法,可以用append方法来代替。示例如下:

    x = [1,2,3]
    x.append(x.pop(0))
    print(x)
    # 结果:[2,3,1]

      7.remove

      remove方法用于移除列表中某个值的第一个匹配项,示例如下:

    >>>x = ['to','be','or','not','be']
    >>>x.remove('be')
    >>>x
    ['to','or','not','be']

      注意:remove是一个没有返回值得原位置改变方法。它修改了列表却没有返回列表,这个方法与pop相反。

      8.reverse

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

      注意:该方法也改变了列表但不返回值(就像remove和sort)

      9.sort

      sort方法用于在原位置对列表进行排序。改变了原来的列

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

      当用户需要一个排好序的列表副本,同时有保留原有列表不变的时候,问题就出现了。为了实现这个功能,我们自然而然的想到了如下方法(实际是错误的):

    >>>x = [4,6,2,1,7,9]
    >>>y = x.sort
    >>>y
    None

      因为sort方法修改了x列表,但sort方法不返回值,所以最后得到的是已排序的x序列和置为None的y。

      实现这个功能的正确方法是先把x的副本赋值给y,然后对y进行排序。如下列所示:

    # 使用分片方法x[:]来获得x所有元素的分片
    >>>x = [4,6,2,1,7,9]
    >>>y = x[:]
    >>>y.sort
    >>>x
    [4,6,2,1,7,9]
    >>>y
    [1,2,4,6,7,9]
    
    # 简单的把x赋值给y是没有用的,因为这样做就让x和y都指向了同一个列表了。
    >>>x = [4,6,2,1,7,9]
    >>>y = x
    >>>y.sort
    >>>x
    [1,2,4,6,7,9]
    >>>y
    [1,2,4,6,7,9

      另外一种获取已排序的列表副本的方法是,使用sorted函数

    >>>x = [4,6,2,1,7,9]
    >>>y = sorted(x)
    >>>y.sort
    >>>x
    [4,6,2,1,7,9]
    >>>y
    [1,2,4,6,7,9

    2.4 元组:不可变序列

      元组与列表一样,也是一种序列。唯一不同的是元组不能修改。

      1.tuple函数

      以一个序列为参数并把它转换为元组

      2.元组存在的意义

      元组可以在映射和集合的成员中当作键使用——而列表则不行。

      

  • 相关阅读:
    How to show query plan and runtime statistic in Derby
    How to load Additional Supplied Modules for Postgres on Windows
    一步一步学List Control控件的用法(第一步)创建第一列
    如何为Postgresql数据库全文搜索(full text search)编写解析器(parser)
    [转]MFC和CLR的区别
    一步一步学Edit Control控件的用法
    将接收到的IP地址转化为字符串显示(代码)
    一步一步学List Control控件的用法(第三步)设置风格
    Andrew NgML第九&十章神经网络
    PAT 1019 General Palindromic Number[简单]
  • 原文地址:https://www.cnblogs.com/rsdqc/p/5147070.html
Copyright © 2020-2023  润新知