• Python基础语法-内置数据结构之列表


    列表的一些特点:

    1. 列表是最常用的线性数据结构

    2. list是一系列元素的有序组合

    3. list是可变的

    列表的操作,

    1. 增:append、extend、insert

    2. 删:clear、pop、remove

    3. 改:reverse、sort

    4. 查:count、index

    5. 其他:copy

    >>> [a for a in dir(list) if not a.startswith('__')]
    ['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

    定义与初始化列表

    lst = list() # 使用list函数定义空列表
    lst = [] # 使用中括号定义空列表
    a = [1, 2, 3] # 使用中括号定义带初始值的列表
    lst = list(range(1, 10)) # 使用list函数把可迭代对象转化为列表
    a_ref = aa[2] = 100

    列表的访问

    可以通过下标访问列表中的元素,下标从0开始。当下标超出范围时,会抛出IndexError异常。下标可以是负数,负数下标从右开始,与正数下标刚好相反。负数下标从-1开始。不管是正数的下标还是负数的下标,只要超出范围,就会抛出异常。

    lst = [1, 2, 3]
    print(lst[0])
    print(lst[2])
    # print(lst[3])

    列表常用操作

    我们可以通过列表的下标(或索引)找到相应的元素,也可以通过列表元素找到其相应的索引。列表提供了index方法可以实现此需求,接下来我们就看一下如何使用列表的index方法。

    lst = [1, 2, 3, 2, 5]help(lst.index)
     : Help on built-in function index:
     : 
     : index(...) method of builtins.list instance
     :     L.index(value, [start, [stop]]) -> integer -- return first index of value.
     :     Raises ValueError if the value is not present.
     :

    index可以有其他两个参数,start,stop可以为负数,但是总是从左往右查找。

    index方法根据值返回第一个索引。

    a_copy = a[:]
    a.append(300) # 在列表的末尾增加一个元素
    a.insert(1, 50) # 在指定位置增加一个元素,如果索引超出范围,如果是正索
    # 引,等效于append,如果索引为负数,等效于insert(0, object)。
    a.pop() # 默认从列表最后移除一个元素,可以指定索引;索引不能超出范围
    a.sort() # 排序方法a.reverse() # 反转方法
    a.remove(value) # 移除列表中第一次出现的value,如果value不存在,则抛出ValueError异常
    del a[1]

    列表的count方法用于返回列表里出现元素的个数,如果没有就返回0。

    lst = [1, 2, 3, 2, 3, 5]
    print(lst.count(2))
    print(lst.count(5))
    # there was no element 0
    print(lst.count(0))

    count方法的原型:

    def count(lst, value):
        c = 0
        for x in lst:
            if x == value:
                c += 1
        return c 

    index和count的时间复杂度是O(n)线性复杂度(效率与数据规模成线性相关)。

    由于列是可变的数据结构,因此可以对列表的元素可以进行修改。修改列表的元素直接使用下标操作取出元素并对其赋值即可。

    lst = [1, 2, 3, 2, 4, 3, 5]
    print(lst[2])
    lst[2] = 5
    print(lst[2])
    # 对超出范围的索引修改元素,会抛出IndexError异常
    # lst[7] = 7

    增加列表元素,使用修改列表元素的方法不能增加列表元素。可以使用append方法来增加列表的元素,

     lst = [1, 3, 5, 7]

    lst.append(9)
    print(lst)
    lst.extend([1, 2, 3])
    print(lst)
    lst.extend(range(3))
    print(lst)

    # remove
    # 根据值来删除
    # 从左到右删除第一次出现的元素
    lst.remove(1)
    print(lst)
    # 删除一个不存在的值时,会抛出ValueError异常
    # lst.remove(10)# pop
    # 默认返回并删除最后一个元素
    lst.pop()
    print(lst)
    # pop可以有参数
    # 返回并删除索引所在位置的元素
    lst.pop(1)
    print(lst)
    # 当pop不存在的索引时,抛出IndexError异常
    # lst.pop(100)

    运行结果为:

     : [1, 3, 5, 7, 9]
     : [1, 3, 5, 7, 9, 1, 2, 3]
     : [1, 3, 5, 7, 9, 1, 2, 3, 0, 1, 2]
     : [3, 5, 7, 9, 1, 2, 3, 0, 1, 2]
     : [3, 5, 7, 9, 1, 2, 3, 0, 1]
     : [3, 7, 9, 1, 2, 3, 0, 1] 

    append与extend的对比:

    • append原地修改列表,返回None

    • extend原地修改,返回None

    • append操作单个元素

    • extend操作可迭代对象

    pop与remove的对比:

    • pop是弹出索引对应的值

    • remove是删除最左边的第一次出现的值

    • pop针对的是索引

    • remove针对的是值

    • pop不传递index参数时,其时间复杂度为O(1)

    • pop传递index参数时,其时间复杂度为O(n)

    insert可以在指定的位置处插入元素。当insert时,索引超出范围时:

    • 索引是负数,会在第0个元素前插入元素

    • 索引是正数,会在最后一个元素后插入元素

    lst = [1, 3, 5, 7]
    lst.insert(2, 'm')
    print(lst)
    lst.insert(10, 'e')
    print(lst)
    lst.insert(-10, 'a')
    print(lst)

    运行结果为:

    : [1, 3, 'm', 5, 7]
    : [1, 3, 'm', 5, 7, 'e']
    : ['a', 1, 3, 'm', 5, 7, 'e']

    insert操作的时间复杂度是O(n),append操作的时间复杂度是O(1)。

    列表有copy的方法,

    lst1 = [1, 3, 2, 5, 7]
    lst2 = lst1 # 赋值操作,对可变对象是引用传递,对不可变对象是传值
    print(lst2)
    lst2.remove(2)
    print(lst2)
    print(lst1)
    lst1 = [1, 3, 2, 5, 7]
    lst2 = lst1.copy() # 影子拷贝
    lst2.remove(2)
    print(lst2)
    print(lst1)

    运行结果为:

    : [1, 3, 2, 5, 7]
    : [1, 3, 5, 7]
    : [1, 3, 5, 7]
    : [1, 3, 5, 7]
    : [1, 3, 2, 5, 7]

    赋值操作传递的是引用,也叫浅拷贝。

    copy方法的原型:

    def copy(lst):
        tmp = []
        for i in lst:
            tmp.append(i)
        return tmp

    清除列表,

    lst.clear() # 删除所有元素

    求list的长度,

    lst = []
    print(len(lst))
    lst = list(range(4))
    print(len(lst))

    列表反转,

    列表排序,原地修改,返回None。默认是顺序排列,

    lst.sort()
    lst.sort(reverse=True)

    去除列表中重复元素,

    L1 = ['b', 'c', 'd', 'b', 'c', 'a', 'a']
    L2 = []
    [L2.append(i) for i in L1 if not i in L2]
    print(L2)
    : ['b', 'c', 'd', 'a']
    iter = (x ** 2 for x in range(10) if x % 2 == 0)
    iter
    <generator object <genexpr> at 0x1056b42b0>>>>
    for el in iter:
    print(el)
    0
    4
    16
    36
    64
    ###>>> print [(x, y) for x in (1, 2, 3, 4) for y in (10, 15, 3, 22) if x * y > 25]
    [(2, 15), (2, 22), (3, 10), (3, 15), (3, 22), (4, 10), (4, 15), (4, 22)]

    来看几个跟列表应用的例子,

    # 求素数的列表使用法lst = []for n in range(2, 101):
        for x in lst:
            if n % x == 0:
                break
            else:
                lst.append(n)
                print(n)

    一个例子

    一个可以输出直方图的例子,代码如下:

    (venv) [lavenliu@VM_171_247_centos mysite]$ cat hist.py 
    # 从一个列表中创建一个直方图
    values = [] # 首先创建一个空列表# 我们输入10个整数
    print("Enter 10 integers:")
    for i in range(10):
    newValue = int(input("Enter integer %d: " % (i+1)))
    values += [newValue]
    # 创建直方图
    print(" Creating a histogram from values:")
    print("%s %10s %10s" % ("Element", "Value", "Histogram"))
    for i in range(len(values)):
    print("%7d %10d  %s" % (i, values[i], "*" * values[i]))

    运行结果为:

    venv lavenliu@VM_171_247_centos mysite$ python hist.py 
    Enter  integers:
    Enter integer 1: 10
    Enter integer 2: 8
    Enter integer 3: 23
    Enter integer 4: 15
    Enter integer 5: 2
    Enter integer 6: 5
    Enter integer 7: 7
    Enter integer 8: 9
    Enter integer 9: 6
    Enter integer 10: 4
    Creating a histogram from values:
    Element      Value  Histogram
                     **********
                      ********                 ***********************      
                     ***************      
                      **                  *****      
                      *******                  *********                  ******                  ***
  • 相关阅读:
    使用kendynet构建异步redis访问服务
    使用kendynet编写网关服务
    作为前端,我为什么选择 Angular 2?
    你必须知道的Javascript 系列
    JS日期(Date)处理函数总结
    JS数组(Array)处理函数总结
    消息推送之APNS
    消息推送之GCM
    Linux常用命令大全
    Sequential Container
  • 原文地址:https://www.cnblogs.com/river2005/p/8142628.html
Copyright © 2020-2023  润新知