什么是列表?

--一种数据类型

-- 形式:[值1,值2,[值a,值b],值3]      --可以嵌套

#!/usr/bin/python3
list_a = [1, 2, [3, 'a']]

对于列表有哪些操作?

--取值              -- list[index]          -- list[-1]        取最后一个值

--知元素,查位置:列表名.index(‘元素名’)

 #!/usr/bin/python3
 list_a = [1, 2, [3, 'a']]
 print(list_a[0])        # 索引从0开始
 print(list_a[2][1])     # 嵌套循环,需要嵌套查询
 try:
     print(list_a.index('a'))
 except Exception as e:
     print(e)
     print('why?')
     print('因为index()和for 遍历一样,只能遍历一层,[3, a],被当做一个元素')

--插入              -- .insert(位置,一个元素)            -- .append(‘元素’)        - 最后追加一个元素

 #!/usr/bin/python3
 list_a = [1, 2, [3, 'a']]
 try:
     list_a.insert(5, 'b')    # 当索引位置大于原来列表索引,默认最后添加'b'
     print(list_a)
     list_a.insert(1, 4)      # 在索引 = 1的位置添加4,原来在1位置的往后退一位
     print(list_a)
     list_a.append('c')       # 在最后添加'c'
 except Exception as e:
     print(e)

--切片

  --[start:end:step] 顾头不顾尾,前面从0开始,0可省去,后面从-1开始,降序

  -- 取前面2个值:       列表[0:2]            或 列表[:2]

  -- 取后面2个值:       列表[-3:-1]         或 列表[-2:]

  -- 取到倒数第2个值:         列表[0:-2]

  -- 取从索引2到最后的值:       列表[2:]

 #!/usr/bin/python3
 list_a = [1, 2, [3, 'a'], 4, 5]
 try:
     # 切片也是顾头不顾尾
     slice_1 = list_a[:2]    # 取前面两个值
     slice_2 = list_a[:-2]   # 取到倒数第2个值,不包括倒数第2个值
     slice_3 = list_a[2:]    # 从第2个值取到最后
     slice_4 = list_a[-2:]   # 取倒数2个值
     print(slice_1)
     print(slice_2)
     print(slice_3)
     print(slice_4)
 except Exception as e:
     print(e)

-- 删除

  -- .remove(“元素”)  <=>     del 列表[ index ]

 #!/usr/bin/python3
 list_a = [1, 2, [3, 'a'], 4, 5]
 try:
     list_a.remove(1)    # 移除已知元素值
     print(list_a)

     del list_a[2]       # 知道索引,删除值
     print(list_a)
 except Exception as e:
     print(e)

  -- .pop(index)                 - 不填index删除最后一个        -唯一删除有返回值 = 删除元素

 #!/usr/bin/python3
 list_a = [1, 2, [3, 'a'], 4, 5]
 try:
     result_1 = list_a.remove(1)   # 尝试接收删除的值
     print(result_1)

     result_2 = list_a.pop(1)      # 尝试接收删除的值,唯一有返回值,写索引,按索引删,不写,从最后一个删除
     print(result_2)
 except Exception as e:
     print(e)

  -- .clear                          - 清空列表

  -- .del 列表                     - 删除列表

 #!/usr/bin/python3
 list_a = [1, 2, [3, 'a'], 4, 5]
 try:
     list_a.clear()      # 置空列表
     print(list_a)

     del list_a          # 删除列表
     print(list_a)       # 尝试打印已经删除的列表,触发异常
 except Exception as e:
     print(e)            # 打印异常

-- 统计

-- .count(“元素”)              - 统计列表中有多少个同样的元素

-- len(列表)                       - 统计列表中有多少个同样的元素

-- 反转          -- .reverser()            - 原列表翻转过来

-- 排序          -- .sort()                   - 数字小到大,母A-Z-a-z

 #!/usr/bin/python3
 list_a = [1, 2, [3, 'a'], 4, 5, 6, 6, 5]
 try:
     count = list_a.count(6)     # 计算列表中6个个数
     print(count)

     len_a = len(list_a)         # 计算列表的长度,每个嵌套的都看作一个元素,对于一层
     print(len_a)

     list_a.reverse()            # 把列表反转过来,改变原来的列表
     print(list_a)

     list_a.sort()               # sort只能对普通列表排序,不能排序嵌套列表
     print(list_a)
 except Exception as e:
     print(e)            # 打印异常

-- 扩展          -- .extent(列表2)         - 列表2还存在

-- 复制          -- .copy()                    - 浅浅拷贝 ,大坑,只针对一层列表机制决定

 #!/usr/bin/python3
 list_a = [1, 2, [3, 'a'], 4, 5, 6, 6, 5]
 list_b = [88, 99, 100]
 try:
     list_a.extend(list_b)   # 用list_b扩展list_a,list_b并没有改变
     print('list_a:', list_a)
     print('list_b:', list_b)

     list_c = list_a.copy()  # 进行list_a的拷贝,浅浅拷贝
     print('list_c:', list_c)
     list_c[1] = 'c'         # 对list_c进行一层修改
     list_c[2][1] = 'b'      # 对list_c进行嵌套层修改
     print('list_a:', list_a)
     print('list_c:', list_c)
     print('突然发现,嵌套层也会跟着修改,copy只是拷贝一层')
     print('那如何解决呢?')
 except Exception as e:
     print(e)            # 打印异常

                            -- import copy    ist_deep =copy.deepcopy(list_a)

                  - 完全拷贝一份,深深拷贝

 #!/usr/bin/python3
 import copy

 list_a = [1, 2, [3, 'a'], 4, 5, 6, 6, 5]
 list_b = [88, 99, 100]

 try:
     list_c = copy.deepcopy(list_a)  # 进行list_a的拷贝,深深拷贝
     print('list_c:', list_c)
     list_c[1] = 'c'         # 对list_c进行一层修改
     list_c[2][1] = 'b'      # 对list_c进行嵌套层修改
     print('list_a:', list_a)
     print('list_c:', list_c)
     print('突然发现,嵌套层不会跟着修改,deepcopy会完全拷贝')
     print('真是大天坑,少侠,踩坑了木有')
 except Exception as e:
     print(e)                # 打印异常

什么是元组?

--上了枷锁的列表,一旦定义,无法修改,但可以切片

   -- 形式(元素1,元素2,......)             --声明此数据不要更改

 #!/usr/bin/python3
 tuple_1 = (1, 2, 4, 'a')
 try:
     print(tuple_1.count(1))         # 统计 1 的个数
     print(tuple_1.index(4))         # 打印 4 的索引
     print(tuple_1[:2])              # 取前面2个值,切片出来的值还是元组
 except Exception as e:
     print(e)                        # 打印异常

如何把[1, 5, 6, [2, 7, [3, [4, 5, 6]]]]变成[1, 5, 6, 2, 7, 3, 4, 5, 6]?

思考:

  -- for循环每次都遍历列表一层

    -- 把取出的单个值加入到新的列表中

    -- 把取出来的嵌套列表变成新的遍历列表,就需要在for循环外嵌套一个while循环

  -- 当取到最里面的列表嵌套时候,对最后一个值进行处理

 #!/usr/bin/python3
 import time
 list_1 = [1, 5, 6, [2, 7, 7, [3, [4, 5, 6]]]]  # 定义一个嵌套列表
 list_1_new = list_1                         # 定义递归接收嵌套列表
 list_2 = []                                 # 定义接收取出数据的空列表
 count = 0                                   # 循环计数,用于循环列表长度计数
 while True:                                 # 开始循环
     try:
         for i in list_1_new:                # 每次循环都打印一层
             count += 1
             if count < len(list_1_new):     # 计算小于初始列表的长度,取出一层数据
                 list_2.append(i)
             elif count == len(list_1_new):  # 当计数长度等于初始列表长度,取出二层嵌套列表
                 list_1_new = i              # 把初始列表变成取出的上面取出的嵌套列表,变成变成遍历初始列表的二层嵌套
                 count = 0                   # 计算清零
     except Exception as e:                  # 出现异常打印异常
         print(e)

     print(list_2)                           # 打印每次遍历已经添加的值
     print(list_1_new)                       # 打印每次取出的嵌套列表

     try:
         len(list_1_new)                     # 假如最后只有一个值的时候,触发len()异常
     except TypeError as e:
         print(e)
         list_2.append(list_1_new)           # 把最后一个值添加进去
         break                               # 把最后一个值添加进去跳出循环
 print(list_2)                               # 打印最好的值

没有解决一个问题:

  -- 这个问题本身很特殊,有点递归嵌套,无法解决一层有2个以上的嵌套列表

  如何解决  ['a', 'b', 1, ['c', [2, 'd'], 3, 4, 5, ['e', 6, 'f', ], 7], 8] 变成普通列表?

 #!/usr/bin/python3
 list_1 = ['a', 'b', 1, ['c', [2, 'd'], 3, 4, 5, ['e', 6, 'f', ], 7], 8]     # 初始列表
 list_1_new = list_1                         # 循环映射列表
 list_a = []                                 # 循环添加 取出的单个值
 list_c = []                                 # 循环接收 取出来的嵌套列表,一个中间列表
 while True:                                 # 开始循环
     for i in list_1_new:                    # 开始循环取值

         try:
             if len(list_1):                 # 判断取出是否是整数,是整数触发异常

                 try:
                     if i.isalnum():         # 判断取出是否是字符串,不是字符串触发异常
                         list_a.append(i)    # 是字符串添加到list_a中去

                 except Exception as e:      # 触发不是字符串异常
                     print(e)
                     list_c.extend(i)        # 把取出的嵌套列表加入到list_c中
                     list_1_new = list_c     # 循环list_1_new指向嵌套列表,指向list_c
                     print(list_1_new)       # 打印list_1_new值

         except Exception as e:              # 触发整数len()方法异常
             print(e)
             list_a.append(i)                # 是整数添加到list_a中去

     count = 0                               # 判断取到最后的嵌套列表中是否还有嵌套列表
     for i in list_c:                        # 循环二层嵌套列表
         try:                                # 尝试判断最后一层嵌套列表是否嵌套,如果嵌套,异常次数就会少于列表长度
             len(i)                          # 整数触发异常
             i.isalnum()                     # 不是字符串触发异常
         except Exception as e:
             print(e)
             count += 1                      # 每出现一次异常,异常次数加1
     if count == len(list_c):                # 判断异常次数是否等于最后循环列表长度,如果等于,就确认已经循环了最后一层列表,退出整个循环
         break
     list_c = []                             # 置空中间列表,接收下一层嵌套列表
     print(list_a)
     print(list_1_new)
 print(list_a)

 set_a = set(list_a)                             # 把最后的结果去重,把列表转换成集合,集合天生去重
 print(set_a, )

 # 逻辑整理
 # 本质上通过for循环特性,for循环只能遍历一层
 # 通过遍历,把取出来的单个值进行判断,把符合要求的加入到新的列表中,把不符合的添加到中间列表中
 # 最难的是,如何判断最后的循环?
 # 我的想法是,通过最后中间列表的遍历,判断是否还有嵌套列表,通过异常次数和列表长度比较,
 # 如果中间列表等于异常次数,说明循环到了最后的列表,退出整个循环
 # 最后把结果列表变成集合,利用集合天生去重性质,进行去重

  -- 以上完美解决了任何嵌套列表变成普通列表的问题

python_7_列表的更多相关文章

  1. ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单

    前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...

  2. ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑

    前言: 为了赶进度,周末也写文了! 前几篇讲完查询框和工具栏,这节讲表格数据相关的操作. 先看一下列表: 接下来我们有很多事情可以做. 1:格式化 - 键值的翻译 对于“启用”列,已经配置了格式化 # ...

  3. ASP.NET Aries 入门开发教程3:开发一个列表页面及操控查询区

    前言: Aries框架毕竟是开发框架,所以重点还是要写代码的,这样开发人员才不会失业,哈. 步骤1:新建html 建一个Html,主要有三步: 1:引入Aries.Loader.js 2:弄一个tab ...

  4. ASP.NET Aries 入门开发教程2:配置出一个简单的列表页面

    前言: 朋友们都期待我稳定地工作,但创业公司若要躺下,也非意念可控. 若人生注定了风雨飘摇,那就雨中前行了. 最机开始看聊新的工作机会,欢迎推荐,创业公司也可! 同时,趁着自由时间,抓紧把这系列教程给 ...

  5. 散列表(hash table)——算法导论(13)

    1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...

  6. Python列表去重

    标题有语病,其实是这样的: 假设有两个列表 : L1 = [1,2,3,4] ; L2 = [1,2,5,6] 然后去掉L1中包含的L2的元素 直接这样当然是不行的: def removeExists ...

  7. WPF 微信 MVVM 【续】修复部分用户无法获取列表

    看过我WPF 微信 MVVM这篇文章的朋友,应该知道我里面提到了我有一个小号是无法获取列表的,始终也没找到原因. 前两天经过GitHub上h4dex大神的指导,知道了原因,是因为微信在登录以后,web ...

  8. Emoji选项列表

    一.需要的前提文件 从网上下载Emoji的表情包,当然是png的图片,因为WPF不支持彩色的Emoji,所以,做列表的时候,需要用图片. 随着压缩包一起的还有一个Emoji.xml文件,文件的层级结构 ...

  9. UWP开发必备:常用数据列表控件汇总比较

    今天是想通过实例将UWP开发常用的数据列表做汇总比较,作为以后项目开发参考.UWP开发必备知识点总结请参照[UWP开发必备以及常用知识点总结]. 本次主要讨论以下控件: GridView:用于显示数据 ...

随机推荐

  1. navicat for sqlite 11.1.12 patch 永久试用 不报毒

    因为最近需要用这个但是网上都是注册机没有成功注册,所以就自己动手使用ollydbg开刀,    修改成了永久试用版本. 着急用所以没仔细分析,暂时先这样吧. 这个下载版本 http://dlsw.ba ...

  2. 【Core2.0帮助类】

    缓存帮助类(CacheHelper) /// <summary> /// 缓存帮助类 /// </summary> public class CacheHelper {//下载 ...

  3. 用Windbg来分析.Net程序的dump

    介绍 1. 什么是Windbg WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件. WinDbg是微 ...

  4. 详说 Navicat for MySQL 快捷键

    详说 Navicat for MySQL 快捷键: Navicat 主窗口 Navicat 主窗口快捷键 常规 Navicat 常规快捷键 表设计器 Navicat 表设计器快捷键 表查看器 Navi ...

  5. 初识mysql学习笔记

    使用VMVirtualBox导入Ubuntu后,可以通过sudo apt-get install mysql-server命令下载mysql. 在学习过程中,我遇到了连接不上Xshell的问题.最终在 ...

  6. wifi入侵思路

    一.得到wifi密码   系统:Kali Linux   工具:Aircrack-ng,EWSA   方法:   1.WEP加密:deauth攻击:得到足够报文直接破解.   2.WPA加密:deau ...

  7. jQuery判断Dom对象是否存在

    我们时常要检测一个DOM对象是否为空. var $jObject = $('#btn'); alert($jObject ); 我们会发现,$jObject 永远不会为空.为什么呢?$ 方法查找对象, ...

  8. ProjectEuler 做题记录

    退役选手打发时间的PE计划 挂在这里主要是dalao们看到有什么想交流的东西可以私聊哦(站内信或邮箱吧)~~当然现在高三也不怎么能上网. 2017/8/11  595 :第一题QAQ 2017/8/1 ...

  9. AtCoder Regular Contest 069 D

    D - Menagerie Time limit : 2sec / Memory limit : 256MB Score : 500 points Problem Statement Snuke, w ...

  10. BZOJ 1293: [SCOI2009]生日礼物【单调队列】

    1293: [SCOI2009]生日礼物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2534  Solved: 1383[Submit][Stat ...