• python中列表切片操作


    什么是列表:

    列表(list)是Python以及其他语言中最常用到的数据结构之一。Python使用使用中括号 [ ] 来解析列表。列表是可变的(mutable)——可以改变列表的内容。

    对应操作:

    1 查([])

     1 names_class2=['张三','李四','王五','赵六'] 
     2   
     3 # print(names_class2[2]) 
     4 # print(names_class2[0:3]) 
     5 # print(names_class2[0:7]) 
     6 # print(names_class2[-1]) 
     7 # print(names_class2[2:3]) 
     8 # print(names_class2[0:3:1]) 
     9 # print(names_class2[3:0:-1]) 
    10 # print(names_class2[:])  

    2 增(append,insert)

      insert 方法用于将对象插入到列表中,而append方法则用于在列表末尾追加新的对象

    1 names_class2.append('alex') 
    2 names_class2.insert(2,'alvin') 
    3 print(names_class2) 

    3 改(重新赋值)

    1 names_class2=['张三','李四','王五','赵六'] 
    2   
    3 names_class2[3]='赵七'
    4 names_class2[0:2]=['wusir','alvin'] 
    5 print(names_class2) 

    4 删(remove,del,pop)

    1 names_class2.remove('alex') 
    2 del names_class2[0] 
    3 del names_class2 
    4 names_class2.pop()#注意,pop是有一个返回值的  

    5 其他操作

    5.1  count

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

    >>> ['to', 'be', 'or', 'not', 'to', 'be'].count('to')   
    2  
    >>> x = [[1,2], 1, 1, [2, 1, [1, 2]]]   
    >>> x.count(1)   
    2  
    >>> x.count([1,2])   
    1 

    5.2 extend

             extend 方法可以在列表的末尾一次性追加另一个序列中的多个值。

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

      extend 方法修改了被扩展的列表,而原始的连接操作(+)则不然,它会返回一个全新的列表。

     1 >>> a = [1, 2, 3]   
     2 >>> b = [4, 5, 6]   
     3 >>> a.extend(b)   
     4 >>> a   
     5 [1, 2, 3, 4, 5, 6]   
     6 >>>   
     7 >>> a + b   
     8 [1, 2, 3, 4, 5, 6, 4, 5, 6]   
     9 >>> a   
    10 [1, 2, 3, 4, 5, 6] 

    5.3  index

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

    names_class2.index('李四') 

    5.4  reverse

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

    names_class2.reverse() 
    print(names_class2) 

    5.5  sort

           sort 方法用于在原位置对列表进行排序。

    x = [4, 6, 2, 1, 7, 9] 
    x.sort()#x.sort(reverse=True) 

    5.6  深浅拷贝

    现在,大家先不要理会什么是深浅拷贝,听我说,对于一个列表,我想复制一份怎么办呢?

    肯定会有同学说,重新赋值呗:

    names_class1=['张三','李四','王五','赵六'] 
    names_class1_copy=['张三','李四','王五','赵六'] 

    这是两块独立的内存空间

    这也没问题,还是那句话,如果列表内容做够大,你真的可以要每一个元素都重新写一遍吗?当然不啦,所以列表里为我们内置了copy方法:

     1 names_class1=['张三','李四','王五','赵六',[1,2,3]] 
     2 names_class1_copy=names_class1.copy() 
     3   
     4 names_class1[0]='zhangsan'
     5 print(names_class1) 
     6 print(names_class1_copy) 
     7   
     8 ############ 
     9 names_class1[4][2]=5
    10 print(names_class1) 
    11 print(names_class1_copy) 
    12   
    13 #问题来了,为什么names_class1_copy,从这一点我们可以断定,这两个变量并不是完全独立的,那他们的关系是什么呢?为什么有的改变,有的不改变呢?

    这里就涉及到我们要讲的深浅拷贝了:

     1 #不可变数据类型:数字,字符串,元组         可变类型:列表,字典 
     2   
     3 # l=[2,2,3] 
     4 # print(id(l)) 
     5 # l[0]=5 
     6 # print(id(l))   # 当你对可变类型进行修改时,比如这个列表对象l,它的内存地址不会变化,注意是这个列表对象l,不是它里面的元素 
     7 #                # this is the most important 
     8 # 
     9 # s='alex' 
    10 # print(id(s))   #像字符串,列表,数字这些不可变数据类型,,是不能修改的,比如我想要一个'Alex'的字符串,只能重新创建一个'Alex'的对象,然后让指针只想这个新对象 
    11 # 
    12 # s[0]='e'       #报错 
    13 # print(id(s)) 
    14   
    15 #重点:浅拷贝 
    16 a=[[1,2],3,4] 
    17 b=a[:]#b=a.copy() 
    18   
    19 print(a,b) 
    20 print(id(a),id(b)) 
    21 print('*************') 
    22 print('a[0]:',id(a[0]),'b[0]:',id(b[0])) 
    23 print('a[0][0]:',id(a[0][0]),'b[0][0]:',id(b[0][0])) 
    24 print('a[0][1]:',id(a[0][1]),'b[0][1]:',id(b[0][1])) 
    25 print('a[1]:',id(a[1]),'b[1]:',id(b[1])) 
    26 print('a[2]:',id(a[2]),'b[2]:',id(b[2])) 
    27   
    28   
    29 print('___________________________________________') 
    30 b[0][0]=8
    31   
    32 print(a,b) 
    33 print(id(a),id(b)) 
    34 print('*************') 
    35 print('a[0]:',id(a[0]),'b[0]:',id(b[0])) 
    36 print('a[0][0]:',id(a[0][0]),'b[0][0]:',id(b[0][0])) 
    37 print('a[0][1]:',id(a[0][1]),'b[0][1]:',id(b[0][1])) 
    38 print('a[1]:',id(a[1]),'b[1]:',id(b[1])) 
    39 print('a[2]:',id(a[2]),'b[2]:',id(b[2]))<BR><BR><BR>#outcome 
    # [[1, 2], 3, 4] [[1, 2], 3, 4]
    # 4331943624 4331943752
    # *************
    # a[0]: 4331611144 b[0]: 4331611144
    # a[0][0]: 4297375104 b[0][0]: 4297375104
    # a[0][1]: 4297375136 b[0][1]: 4297375136
    # a[1]: 4297375168 b[1]: 4297375168
    # a[2]: 4297375200 b[2]: 4297375200
    # ___________________________________________
    # [[8, 2], 3, 4] [[8, 2], 3, 4]
    # 4331943624 4331943752
    # *************
    # a[0]: 4331611144 b[0]: 4331611144
    # a[0][0]: 4297375328 b[0][0]: 4297375328
    # a[0][1]: 4297375136 b[0][1]: 4297375136
    # a[1]: 4297375168 b[1]: 4297375168
    # a[2]: 4297375200 b[2]: 4297375200

    那么怎么解释这样的一个结果呢?

      

     再不懂,俺就没办法啦...

     
  • 相关阅读:
    BZOJ 2339: [HNOI2011]卡农 DP+容斥原理
    BZOJ 2560: 串珠子 状压DP+容斥原理
    BZOJ 4455: [Zjoi2016]小星星 容斥原理+树形DP
    BZOJ 2660: [Beijing wc2012]最多的方案 DP+贪心
    【luogu3734】 [HAOI2017]方案数 组合计数
    BZOJ 1495: [NOI2006]网络收费 树形DP+复杂度分析
    在TTF字体中提取想要的文字
    dos命令创建安卓签名
    比较和排序(IComparable和IComparer以及它们的泛型实现)
    unity LineRenderer
  • 原文地址:https://www.cnblogs.com/zerozs/p/8094502.html
Copyright © 2020-2023  润新知