zoukankan      html  css  js  c++  java
  • python中的切片操作

    之前在做毕业设计的时候随手写过python中“:”的作用,即python的切片操作。

    记得刚开始学切片这一节的时候,看完之后,做了作业,感觉记忆深刻。学到后面很多地方都可以用到切片,这时候切片早已被我忘得一干二净。

    这里参考其他的博客进行复习&说明&(自用)  如下:

     基本

    冒号: 用于定义分片、步长。

    a[ : n]表示从第0个元素到第n个元素(不包括n),a[1: ] 表示该列表中的第1个元素到最后一个元素。

    list1[:3:2],tul1[3:6:2](注意3:6是索引第3至5,不包含6)

    L[2] 读取列表中第三个元素,也即第2个元素

    L[-2] 读取列表中倒数第二个元素

    L[1:] 从第二个元素开始截取列表

    list1 = [1,2,3,4,5]
    print list1
    print list1[:-1]
    
    输出结果:
    
    [1, 2, 3, 4, 5]
    [1, 2, 3, 4]
    L=list(range(10))
    L1=L[0:3]  #从索引0开始取,直到索引3为止,但不包括索引3
    #运行结果:[0, 1, 2]
    L2=L[:3]   #如果第一个索引是0,还可以省略
    #运行结果:[0, 1, 2]
    L3=L[:-1]  #Python支持L[-1]取倒数第一个元素,那么它同样支持倒数切片,倒数第一个元素的索引是-1
    #运行结果:[0, 1, 2, 3, 4, 5, 6, 7, 8]
    L4=L[1:8:2] #前8个数,每两个取一个
    #运行结果:[1, 3, 5, 7]
    L5=L[::-1]  #倒叙取每一个数
    #运行结果:[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    L6=L[:]     #只写[:]就可以原样复制一个list
    #运行结果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    python创建二维列表list_2d = [[0 for col in range(cols)] for row in range(rows)]

    >>> list_2d = [ [0 for i in range(5)] for i in range(4)]
    >>> list_2d[0].append(3)
    >>> list_2d[0].append(5)
    >>> list_2d[2].append(7)
    >>> list_2d
    
    结果为[[0, 0, 0, 0, 0, 3, 5], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 7], [0, 0, 0, 0, 0]]

    range() 函数可创建一个整数列表,一般用在 for 循环中。

    函数语法

    range(start, stop[, step])

    参数说明:

    start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5)

    stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5

    step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)

    倒序

    >>> range(100,19,-5)

    结果:[100, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20]

    xrange() 函数用法与 range 完全相同,所不同的是生成的不是一个数组,而是一个生成器

    xrange不想写了.....以后有时间再整理吧......

    part 1 查找

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

    part 2 增(append insert)

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

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

    part 3 重新赋值

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

    part 4 删(remove,del,pop)

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

    part 5 其它

    5.1 count

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

    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 方法修改了被扩展的列表,而原始的连接操作(+)则不然,它会返回一个全新的列表。

    >>> a = [1, 2, 3]   
    >>> b = [4, 5, 6]   
    >>> a.extend(b)   
    >>> a   
    [1, 2, 3, 4, 5, 6]   
    >>>   
    >>> a + b   
    [1, 2, 3, 4, 5, 6, 4, 5, 6]   
    >>> a   
    [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方法:

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

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

    #不可变数据类型:数字,字符串,元组         可变类型:列表,字典 
      
    # l=[2,2,3] 
    # print(id(l)) 
    # l[0]=5 
    # print(id(l))   # 当你对可变类型进行修改时,比如这个列表对象l,它的内存地址不会变化,注意是这个列表对象l,不是它里面的元素 
    #                # this is the most important 
    # 
    # s='alex' 
    # print(id(s))   #像字符串,列表,数字这些不可变数据类型,,是不能修改的,比如我想要一个'Alex'的字符串,只能重新创建一个'Alex'的对象,然后让指针只想这个新对象 
    # 
    # s[0]='e'       #报错 
    # print(id(s)) 
      
    #重点:浅拷贝 
    a=[[1,2],3,4] 
    b=a[:]#b=a.copy() 
      
    print(a,b) 
    print(id(a),id(b)) 
    print('*************') 
    print('a[0]:',id(a[0]),'b[0]:',id(b[0])) 
    print('a[0][0]:',id(a[0][0]),'b[0][0]:',id(b[0][0])) 
    print('a[0][1]:',id(a[0][1]),'b[0][1]:',id(b[0][1])) 
    print('a[1]:',id(a[1]),'b[1]:',id(b[1])) 
    print('a[2]:',id(a[2]),'b[2]:',id(b[2])) 
      
      
    print('___________________________________________') 
    b[0][0]=8
      
    print(a,b) 
    print(id(a),id(b)) 
    print('*************') 
    print('a[0]:',id(a[0]),'b[0]:',id(b[0])) 
    print('a[0][0]:',id(a[0][0]),'b[0][0]:',id(b[0][0])) 
    print('a[0][1]:',id(a[0][1]),'b[0][1]:',id(b[0][1])) 
    print('a[1]:',id(a[1]),'b[1]:',id(b[1])) 
    print('a[2]:',id(a[2]),'b[2]:',id(b[2]))

    对该结果的解释

    --------------------------------------------------------------------------------------------------------

    应用练习

    #利用切片操作,实现一个trim()函数,去除字符串首尾的空格
    def trim(s):
        while s[:1]==' ':  #while循环判断第一个元素是否为空
            s=s[1:]     #为空的话将第一个元素截取
        while s[-1:]==' ':  #while循环判断最后一个元素是否为空
            s=s[:-1]     #为空的话将最后一个元素截取
        return s
    #回数是指从左向右读和从右向左读都是一样的数,例如12321,909。利用filter()筛选出回数:
    def is_palindrome(n):
        if str(n)==str(n)[::-1]:  #判断从左向右读和从右向左读是否都是一样的数
            return n
    print(list(filter(is_palindrome,list(range(100)))))
  • 相关阅读:
    python模块之__future__模块
    SQL之分组排序取top n
    SQL之层次查询
    win server 2008添加磁盘-脱机转换为联机状态方法
    拉链表-增量更新方法一
    一道hive SQL面试题
    一道与时间差有关的SQL面试题
    (转)linux中nmcli命令的使用及网络配置
    (转)内核模块操作命令-lsmod+rmmod+modinfo+modprobe
    (转)Linux 系统设置 : dmesg 命令详解
  • 原文地址:https://www.cnblogs.com/baobaotql/p/11231042.html
Copyright © 2011-2022 走看看