• python 列表


    列表

    当我们有多个数据需要保存的时候,可以考虑使用列表。列表是有序的,用户可以通过下标的方式对列表进行切片,还可以使用下标来修改列表的元素。

    1.列表的表示方式

    names = ["tank","tom","frank","jerry","honey"]
        
    # 使用list传入一个可迭代对象进行转换
    >>> words = list(("a","b",'c'))
    >>> print(words)
    ['a', 'b', 'c']
    

    2.列表的操作

    2.1 增加元素

    append # 在列表的最后面追加数据

    insert # 在索引之前加入一个对象

    extend # 把另外一个可迭代对象融合到一起

    #列表的最后添加一个元素
    >>> names = ["tank","tom","frank","jerry","honey"]
    >>> names.append("jj")
    >>> names
    ['tank', 'tom', 'frank', 'jerry', 'honey', 'jj']
    
    # 在索引2的位置添加xinlin
    # insert(index,object)
    >>> names.insert(2,"xinlin")
    >>> names
    ['tank', 'tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj']
    
    # 拼接一个可迭代对象,后面是传入一个可迭代对象。
    >>> words
    ['b', 'c', 'z', 'a']
    >>> names.extend(words)
    >>> names
    ['tank', 'tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z', 'a']
    

    2.2 删除元素

    pop # 默认删除列表最后一个数据,并返回。根据下标取出元素。

    remove # 删除指定的元素,如果有重复的元素会先删除索引较小的,删除元素不存在会报错。

    clear # 清空列表

    del # 也可以删除指定元素

    # pop 方法
    >>> names
    ['tank', 'tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z', 'a']
    >>>
    >>> names.pop()
    'a'
    >>> names
    ['tank', 'tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z']
    >>> names.pop(0)
    'tank'
    >>> names
    ['tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z']
    
    # remove
    >>> names = ['tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z']
    >>> names.remove("jj")
    >>> names
    ['tom', 'xinlin', 'frank', 'jerry', 'honey', 'b', 'c', 'z']
    
    # del 删除指定元素
    >>> names
    ['tom', 'xinlin', 'frank', 'jerry', 'honey', 'b', 'c', 'z']
    >>>
    >>> del [names[0]]
    >>> names
    ['xinlin', 'frank', 'jerry', 'honey', 'b', 'c', 'z']
    
    # 清空列表
    >>> names.clear()
    >>> names
    []
    

    2.3 修改元素

    使用下标直接修改。

    >>> names = ['tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z']
    >>> names[0] = 'zeop'
    >>> names
    ['zeop', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z']
    

    2.4 查询元素

    index     # 查看元素的索引,如果没有该元素会报错。
    count     # 查看元素出现的次数。
    in        # 查看元素是否在列表中。
    
    # 返回元素的索引
    >>> names
    ['zeop', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z']
    >>> names.index('xinlin')
    1
    
    # 查看元素出现的次数
    >>> names = ['zeop', 'xinlin', 'frank', 'jerry', 'honey','a','a','a']
    >>> names.count('a')
    3
    
    # 查看元素是否在可迭代对象中,返回布尔值
    >>> names = ['zeop', 'xinlin', 'frank', 'jerry', 'honey','a','a','a']
    >>> "frank" in names
    True
    

    3.列表的遍历

    2.1 while遍历

    # while 遍历
    names = ["frank",'tom','jerry','pink panther','spike']
    tag = 0
    while tag < len(names):
        print(names[tag])
        tag +=1
    

    2.2 for 遍历

    names = ["frank",'tom','jerry','pink panther','spike']
    for i in names:
        print(i)
    

    4.变量的替换

    # 中间量替换
    a = 20
    b = 10
    
    c = b
    b = a
    a = c
    print("a:",a,"\nb:",b)
    
    # 逻辑运算,只限于数字
    a = 10
    b = 20
    
    a = a + b
    b = a - b
    a = a - b
    print("a:",a,"\nb:",b)
    
    # python 特有的
    a = 10
    b = 20
    a, b = b, a
    print("a:",a,"\nb:",b)
    

    5.列表的排序

    >>> num = [1,4,5,2,3,7,9]
    >>> num.sort()
    >>> num
    [1, 2, 3, 4, 5, 7, 9]
    
    # 反转排序
    >>> num.sort(reverse=True)
    >>> num
    [9, 7, 5, 4, 3, 2, 1]
    
    # 内置函数sorted,不会改变列表值,会生成一个新的列表。
    >>> num = [1,4,5,2,3,7,9]
    >>> sorted(num)
    [1, 2, 3, 4, 5, 7, 9]
    >>> x = sorted(num)
    >>> x
    [1, 2, 3, 4, 5, 7, 9]
    >>> num
    [1, 4, 5, 2, 3, 7, 9]
    

    6.列表元素反转

    # 1、通过切片的方式
    >>> names = ["tank","tom","frank","jerry","honey"]
    >>> names[::-1]
    ['honey', 'jerry', 'frank', 'tom', 'tank']
    
    # 直接反转列表会更改列表内容
    >>> names
    ['tank', 'tom', 'frank', 'jerry', 'honey']
    >>> names.reverse()
    >>> names
    ['honey', 'jerry', 'frank', 'tom', 'tank']
    

    7.可变类型与不可变类型

    python中的数据都是保存在内存里面的。数据类型可以分为两类:

    可变数据类型 : 列表、字典、集合

    不可变数据类型:字符、数字、元组

    可以使用id()函数查看内存地址。

    不可变数据类型,如果修改内存地址火发生变化。

    可变数据类型不会发生变化。

    不可变数据类型

    # 不可变数据类型
    a = 12
    b = a
    print(a,b)
    print("修改前:a的内存地址: %X,b的内存地址: %X" % (id(a), id(b)))
    a = 24
    print("修改后:a的内存地址: %X,b的内存地址: %X" % (id(a), id(b)))
    print(a,b)
    
    12 12
    修改前:a的内存地址: 7FFC415CA300,b的内存地址: 7FFC415CA300
    修改后:a的内存地址: 7FFC415CA480,b的内存地址: 7FFC415CA300
    24 12
    

    原理图解

    修改前

    修改后

    可变数据类型

    names = ["tom","squire","zep"]
    c = names
    print(names,c)
    print("修改前内存地址:names: %X ,c: %X" % (id(names), id(c)))
    
    names[0] = 'kindon'
    print("修改后内存地址:names: %X ,c: %X" % (id(names), id(c)))
    print(names,c)
    
    ['tom', 'squire', 'zep'] ['tom', 'squire', 'zep']
    修改前内存地址:names: 1E268BF5188 ,c: 1E268BF5188
    修改后内存地址:names: 1E268BF5188 ,c: 1E268BF5188
    ['kindon', 'squire', 'zep'] ['kindon', 'squire', 'zep']
    

    原理图解

    修改后,还是指向同一内存地址所以c的值也会改变。

    8.列表的复制

    浅复制

    # 这样复制列表会有一个问题就是names 和x的内存地址空间都是指向同一地址空间,这样地址空间中存储的数据发生了变化变量names和x都会变。
    names = ["tom", "jerry", "spaik", "john"]
    x = names
    
    names[0]= '张三'
    print(names,x)
    

    方法一

    # 这样新的变量生成了新的地址空间,就不会互相影响。
    names = ["tom", "jerry", "spaik", "john"]
    x = names.copy()
    
    names[0] = '张三'
    print("names的地址空间0x%X, x的地址空间0x%X" % (id(names), id(x)))
    print(names,x)
    

    方法2

    import copy
    
    names = ["tom", "jerry", "spaik", "john"]
    x = copy.copy(names)
    names[0] = '张三'
    print("names的地址空间0x%X, x的地址空间0x%X" % (id(names), id(x)))
    print(names,x)
    

    方法3

    names = ["tom", "jerry", "spaik", "john"]
    x = names[::]
    names[1] = "老五"
    
    print("names的地址空间0x%X, x的地址空间0x%X" % (id(names), id(x)))
    print(names,x)
    

    深复制

    浅复制默认只复制一层,深复制必须使用copy模块,

    # 浅复制,对于这种嵌套列表,里面的列表还是指向同一内存地址;所以在改变了嵌套列表中的值之后还是影响了浅复制的变量。
    import copy
    
    words = ['linsan', "juice",[1,2,3] ,"john", "linlin"]
    
    words1 = words.copy()
    words[2][0] = 1000
    print(words1)
    ['linsan', 'juice', [1000, 2, 3], 'john', 'linlin']
    
    # 深复制
    import copy
    
    words = ['linsan', "juice",[1,2,3] ,"john", "linlin"]
    
    words1 = words.copy()
    words2 = copy.deepcopy(words)
    
    words[2][0] = 1000
    print(words1)
    print(words2)
    
    # ------深复制的结果------
    ['linsan', 'juice', [1000, 2, 3], 'john', 'linlin']
    ['linsan', 'juice', [1, 2, 3], 'john', 'linlin']
    

    pythontutor.com

    9.列表的嵌套

    把十个老师随机分到三个办公室中。

    import random
    
    teachers = ["A", "B", "C", "D", "E", "F", 'G', "H"]
    zoons = [[], [], []]
    
    for i in teachers:
        zoons[random.randint(0,2)].append(i)
    print(zoons)
    
    # 使用for的方式
    for i in teachers:
        zoom = random.choice(zoons)
        zoom.append(i)
    print(zoons)
    
    
    # 把每个办公室的老师列出来
    for i in teachers:
        zoom = random.choice(zoons)
        zoom.append(i)
    
    # 一般要引用下標的使用while
    # for也可以使用下標
    for i ,zoom in enumerate(zoons):
        print("辦公室%d ,有老師:" % i, end=" ")
        for z in zoons[i]:
            print(z, end=" ")
        print()
    

    10.列表推导式

    一般只用于生成简单的列表

    # 最简答的列表推导式
    points = [i for i in range(10)]
    print(points)
    
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    # 含有条件的列表推导
    points2 = [x for x in range(10) if x % 2 == 0]
    print(points2)
    
    [0, 2, 4, 6, 8]
    
    # 含有两个参数的推导式
    points3 = [(y, z) for y in range(2) for z in range(3)]
    print(points3)
    
    [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]
    

    11.练习

    找出列表中最大的数。

    nums = [1, 3, 4, 6, 2, 54, 67, 32, 4, 3, 9, 8]
    """
    假設第一個數字為最小的一個數用它去和其它的數進行比較,如果比它大就把它從新
    賦值,如果比它小就忽略。
    """
    x = nums[0]
    for i in nums:
        if x < i:
            x  = i
    print(x)
    

    找出列表中最大的数并找到下标。

    # 方法一
    nums = [1, 3, 4, 6, 2, 54, 67, 32, 4, 3, 9, 8]
    
    x = nums[0]
    for i in nums:
        if x < i:
            x  = i
    print('列表中最大的數%d,下標是:%d' % (x, nums.index(x)))
    
    # 方法二
    nums = [1, 3, 4, 6, 2, 54, 67, 32, 4, 3, 9, 8]
    
    i = 0
    num = nums[0]
    while i < len(nums):
        if num < nums[i]:
            num = nums[i]
            index = i
        i +=1
    print('列表中最大的數是:%d,索引是%d' % (num, index))
    

    删除列表中的空字符串

    # 會有bug
    words = ["zhangsna", "ahahha", "joker", "","","wa","ji",""]
    for i in words:
        if i == "":
            words.remove(i)
    print(words)
    
    ['zhangsna', 'ahahha', 'joker', 'wa', 'ji', '']
    
    # 非空字符串进行新的赋值
    new_words = []
    words = ["zhangsna", "ahahha", "joker", "","","wa","ji",""]
    for i in words:
        if i != "":
            new_words.append(i)
    words = new_words
    print(words)
    
    ['zhangsna', 'ahahha', 'joker', 'wa', 'ji']
    
    words = ["zhangsna", "ahahha", "joker", "","","wa","ji",""]
    i = 0
    while i < len(words):
        if not words[i]:
            words.remove(words[i])
            i -=1
        i +=1
    print(words)
    
    ['zhangsna', 'ahahha', 'joker', 'wa', 'ji']
    

    把列表1-100的数字转换为三个一组的嵌套列表。比如[1,2,3,4,5,6,......,100]变为[[1,2,3],[4,5,6],[7,8,9],...]

    # 把列表1-100的数字转换为三个一组的嵌套列表。比如[1,2,3,4,5,6,......,100]变为[[1,2,3],[4,5,6],[7,8,9],...]
    m = [i for i in range(1,101)]
    
    points = [m[x:x+3] for x in range(0,101,3)]
    print(points)
    
  • 相关阅读:
    No enclosing instance of type XXX is accessible.
    No enclosing instance of type XXX is accessible.
    Websphere 学习(一)
    List去重与equals/hashcode
    List去重与equals/hashcode
    org.apache.log4j.Logger详解
    org.apache.log4j.Logger详解
    onclick="return checkForm()" 、onclick="checkForm();return false;"解析 与 return false;
    onclick="return checkForm()" 、onclick="checkForm();return false;"解析 与 return false;
    大数据基础第一天内容
  • 原文地址:https://www.cnblogs.com/gshelldon/p/16367664.html
Copyright © 2020-2023  润新知