鱼C论坛

 找回密码
 立即注册
查看: 1666|回复: 0

[经验总结] Python学习 对list切片的一些理解

[复制链接]
发表于 2018-8-1 16:30:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 代号3 于 2018-8-1 23:49 编辑


编译器代码
  1. list4=['123','sdf','12d',3,'3']
  2.     print(list4)
  3.     print(list4[0:2])
  4.     print(list4)
  5.     print('3' in list4[0])
  6.     # print(3 in list4[3])
  7.     print(list4[:0])
  8.     print(list4[:1])
  9.     print(list4[:-2])
复制代码

输出结果
  1. ['123', 'sdf', '12d', 3, '3']
  2. ['123', 'sdf']
  3. ['123', 'sdf', '12d', 3, '3']
  4. True
  5. []
  6. ['123']
  7. ['123', 'sdf', '12d']
复制代码

过程分析
        1·建立列表并初始化 分析第3个元素-3与第四个元素-‘3’在列表中是否存储的类型有差异
  1.   list4=['123','sdf','12d',3,'3']
  2.     num1=list4[3:4]
  3.     print(num1)
  4.     print(type(num1))
  5.     num2=list4[4:5]
  6.     print(num2)
  7.     print(type(num2))
  8.     print(type(list4[3]))
  9.     print(type(list4[4]))
复制代码

        结果如下
  1. [3]
  2. <class 'list'>
  3. ['3']
  4. <class 'list'>
  5. <class 'int'>
  6. <class 'str'>
复制代码

从输出结果可知 通过切片获得的元素数据类型为list型 而通过type直接判断列表中的元素获得的列表中的元素类型是不一样的
        2·对list4进行切片 并在切片前和切片后分别打印list4  输出结果显示切片并不破坏原有列表的元素存储 而是开辟新的内存进行存储       
        3·对列表中元素进行获取判断
  1. list4=['123','sdf','12d',3,'3']
  2.     print('3'in list4[0])
  3.     print('3'in list4[2])
  4.     print('3'in list4[4])
复制代码

        结果如下
  1. True
  2. False
  3. True
复制代码

        而
  1. list4=['123','sdf','12d',3,'3']
  2.     print('3'in list4[0])
  3.     print('3'in list4[3])
复制代码
  1. Traceback (most recent call last):
  2. True
  3.   File "C:/Python/test.py", line 80, in <module>
  4.     print('3'in list4[3])
  5. TypeError: argument of type 'int' is not iterable
复制代码

        说明在list中通过in进行判断需要区分元素的数据类型 在Python中‘3’同样视为字符串类型 无单字符型 也是一种列表
        4·整形数据的in判断
  1. list4=['123','sdf','12d',3,'3']
  2.     print(3 in list4[4])
复制代码

结果
  1. Traceback (most recent call last):
  2.   File "C:/Python/test.py", line 79, in <module>
  3.     print(3 in list4[4])
  4. TypeError: 'in <string>' requires string as left operand, not int
复制代码

报错:在<String >”中需要字符串作为左操作数,而不是int
  1.   list4=['123','sdf','12d',3,'3']
  2.     print(3 in list4[3])
复制代码

结果
  1. Traceback (most recent call last):
  2.   File "C:/Python/test.py", line 80, in <module>
  3.     print(3 in list4[3])
  4. TypeError: argument of type 'int' is not iterable
复制代码

报错:类型“int”的参数不是可迭代的
结论:在list中元素类型存取是区分的 如果需要通过in获得3的切片可写为[3]即可
        5·对省略切片的写法浅析
        正数写法:
  1. list4=['123','sdf','12d',3,'3']
  2.     print(list4[:0])
  3.     print(list4[:1])
  4.     print(list4[:5])
  5.     print(list4[:6])
  6.     print(list4[:100])
复制代码

结果:
  1. []
  2. ['123']
  3. ['123', 'sdf', '12d', 3, '3']
  4. ['123', 'sdf', '12d', 3, '3']
  5. ['123', 'sdf', '12d', 3, '3']
复制代码

        从结果中可知当省略写法直接打印第一个元素即存储在0号位置的元素时需要写[:1]而非[:0],另 当切片索引结尾位置
大于切片本身大小时并未出现内存访问越界报错扔输出原列表
        负数写法:
  1. list4=['123','sdf','12d',3,'3']
  2.     print(list4[:-0])
  3.     print(list4[:-1])
  4.     print(list4[:])
  5.     print(list4[:-2])
  6.     print(list4[:-4])
  7.     print(list4[:-5])
  8.     print(list4[:-100])
复制代码

结果:
  1. []
  2. ['123', 'sdf', '12d', 3]
  3. ['123', 'sdf', '12d', 3, '3']
  4. ['123', 'sdf', '12d']
  5. ['123']
  6. []
  7. []
复制代码

        在负数写法中,-0仍是打印为空,而-1的打印为列表从后向前遍历去除最后一个元素,当全部省略打印时可输出列表全部
元素,同样在反向索引过界时打印为空而不会出现内存访问报错;

对内存越界问题希望可以在讨论区见到更多讨论,对此处的内存分析不甚了解




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-18 11:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表