摘要:接下来本文将从这四个方面来介绍列表的一些常用小技巧。可能有人会对这两种拷贝存在疑问,他们得到的列表的形式不是一样的嘛是的,它们在拷贝后得到的列表形式确实是一样的。比较两个列表是否是一样的,这里的前提条件是这两个列表对象不是同一个对象。
微信公众号:冰咖啡与狗1. 列表
一杯冰咖啡,一条狗,一个碎碎念的程序员...
不同于 C++ 和 Java,在 Python 中,没有在标准库中内置数组类型,而是通常利用列表来表示数组,同时它也比数组的使用要灵活得太多。
列表是 Python 中最基本的数据结构,列表中的元素的存储是有序的,所以我们可以直接利用索引去访问列表中的值。在学习数据结构时,我们知道,对一个数据结构的操作,无外乎增删改查四种。接下来本文将从这四个方面来介绍列表的一些常用小技巧。
1.1. 列表中的增对列表的增加操作有两种,一种是创建一个新的列表,一种是在一个已有的列表中增加一个新元素。我们首先介绍如何创建一个新的列表:
# 创建一个空列表 list1 = [] # 创建一个默认值为0,长度为n的列表 list2 = [0] * n # 利用列表生成式创建列表 list3 = [i for i in range(10)] # 5*5 二维列表 list4 = [[i for i in range(5)] for j in range(5)] # 利用其他数据结构生成列表, list() 函数接收一个可迭代对象作为参数 tuple1 = (1, 2, 3) list5 = list(tuple1) # 字符串转化为列表 str1 = "I love code" # 每个元素作为列表中的一个元素 list6 = list(str1) # 按照指定字符分割 list7 = str1.split(" ") # ["I", "love", "code"]
在编程过程中,有时我们需要对一个列表进行操作,但是列表是一个可变对象,对列表的操作往往会改变其本来的顺序结构。因此,当我们不想改变列表原有的顺序结构,我们需要对旧的列表进行一个拷贝,然后在新的列表上进行操作。拷贝存在两种,浅拷贝和深拷贝。可能有人会对这两种拷贝存在疑问,他们得到的列表的形式不是一样的嘛?
是的,它们在拷贝后得到的列表形式确实是一样的。但是在进行操作时,就会有很大的差别了,特别是当你的列表中存在可变对象时。我们只需要记住一点,浅拷贝只复制不可变对象,而深拷贝不仅复制不可变对象,还复制了可变对象。以下进行举例说明:
# 如果一个列表中的元素都是不可变对象,可以直接用浅拷贝 list1 = [1, 2, "i"] list2 = list1[::1] # 浅拷贝 list3 = [i for i in list1] # 浅拷贝 import copy list4 = copy.copy(list1) # 浅拷贝 # 如果一个列表中的元素包含可变对象,要完成复制列表,需要用深拷贝 list5 = ["Will", 1, ["Python", "Java", "C++"]] list6 = copy.deepcopy(list5)
为什么在包含不可变对象的时候,需要用到深拷贝呢?
上面我们说过,浅拷贝只拷贝不可变对象。当列表中存在可变对象时,我们可以发现其引用 id 是一样的,即它们是同一个对象,因此对 list5 的操作会影响到 list6 。而在深拷贝中,对于可变对象,在拷贝的新列表中会生成一个新的对象,所以对 list6 的修改不会影响到 list5 。
id(list5[2]) # 2195936916360 id(list6[2]) # 2195936916744
对列表的另一种增加操作就是在已有的列表的基础上增加元素了,主要包括以下几种操作:
list1 = ["I"] # 在列表尾部增加一个新元素 list1.append("love") # 合并两个列表 list2 = ["Apple", 3] list1.extend(list2) # ["I", "love", "Apple", 3] list1 = list1 + list2 # ["I", "love", "Apple", 3] # 在指定位置插入元素 list1.insert(index=1, "not") # ["I", "not", "love", "Apple", 3]
对数据结构的删除操作包括两种,删除整个列表,或者删除列表中的某些元素。对于从内存中删除整个列表,该操作十分简单:
list1 = [1, 2, 3] del list1
对于删除列表中的元素,同样可以使用 del 语句,同时还可以使用 remove() 函数。
list1 = [1, 2, 3] print(list1) # [1, 2, 3] del list1[1] print(list1) # [1, 3] # 移除某个值的第一匹配项 list2 = [1, 2, 2, 3, 5] list2.remove(2) # 移除第一个值为 2 的元素
修改操作即在原有的列表的基础上对其进行修改,上面以及介绍了增加和删除操作,这里就对不改变元素的个数的操作进行介绍,主要包括排序和反转列表等。
# 对一个整数列表进行排序 list1 = [9, 5, 6, 2, 7, 1, 3] # 升序排列 list1.sort() # [1, 2, 3, 5, 6, 7, 9] list1 = sorted(list1) # [1, 2, 3, 5, 6, 7, 9] # 降序排列 list1.sort(reverse=True) # [9, 7, 6, 5, 3, 2, 1] list1 = sorted(list1, reverse=True) # [9, 7, 6, 5, 3, 2, 1] # 指定键值排序 list1 = [("a", 3), ("b", 2), ("c", 1)] list1.sort(key=lambda x:x[1]) # [("c", 1), ("b", 2), ("a", 3)] ## 反转列表,即将原来的列表逆序排列 list2 = [4, 2, 3, 1] list2 = list2[::-1] # [1, 3, 2, 4] list2.reverse() # [1, 3, 2, 4]
对列表的查找操作无外乎以下几种:
遍历列表;
查找指定索引的元素;
查找指定值的元素;
列表的遍历方式有三种,分别是根据索引遍历、根据值遍历和 enumerate()遍历。
list1 = ["Python", "C++", "Java"] # 方法 1 for i in range(len(list1)): print(list1[i]) # 方法 2 , 遍历速度最高效,但是无法记录索引 for i in list1: print(i) # 方法 3 for index, val in enumerate(list1): print(val)
查找元素有两种,一种是按照索引查找,一种是遍历按值查找。
# 查找指定索引的元素 list1 = [1, 3, 2, 5, 7, 8] list1[3] # 返回索引为 3 的元素,值为5 # 查找指定值的元素 key = 5 for i in list1: if i == key: print("OK") # 查找最大元素和最小元素 max(list1) # 8 min(list1) # 1
上述介绍了列表的增删改查四种常用操作,当然对列表的操作不仅仅只有这些,例如还有两个列表的比较,列表结构的转化等等。
比较两个列表是否是一样的,这里的前提条件是这两个列表对象不是同一个对象。
list5 = [("car", 1), ("bike", 2), ("foot", 3)] list6 = [("car", 1), ("bike", 2), ("foot", 3)] # 判断两个列表是否是同一个对象 list5 is list6 # False # 判断两个列表是否相等 list5 == list6 # True # 当列表中的元素很多,且结构复杂时,可以使用 numpy 模块 import numpy as np a = np.array(list5) b = np.array(list6) (a == b).all() # True
列表结构的转化主要包括将列表转化为元组、集合、字符串和字典:
list1 = ["a", "b", "c", "d", "c"] # 列表转化为元组 tuple1 = tuple(list1) # ("a", "b", "c", "d", "c") # 列表转化为集合 set1 = set(list1) # {"a", "b", "c", "d"} # 列表转化为字符串 str1 = "".join(list1) # "abcdc" # 列表转化为字典,元素为 key, 次数为 value from collections import Counter, defaultdict dict1 = Counter(list1) # Counter({"a": 1, "b": 1, "c": 2, "d": 1}) # 或者 dict2 = defaultdict(int) for i in list1: dict2[i] += 1 dict2 # defaultdict(int, {"a": 1, "b": 1, "c": 2, "d": 1})
欢迎扫码关注公众号冰咖啡与狗,一起每日进步。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/43937.html
摘要:元组是静态数组,它们不可变,且其内部数据一旦创建便无法改变。元组缓存于运行时环境,这意味着我们每次使用元组时无须访问内核去分配内存。 以下是整理的JavaScript和python的基础区别的整理: 字符串、列表、元组、字典、集合、函数 字符串 声明一个字符串 python str = 123 str = 123 Tips: 如果是三个引号的话,那么在py中就是注释的意思 ...
摘要:元组是静态数组,它们不可变,且其内部数据一旦创建便无法改变。元组缓存于运行时环境,这意味着我们每次使用元组时无须访问内核去分配内存。 以下是整理的JavaScript和python的基础区别的整理: 字符串、列表、元组、字典、集合、函数 字符串 声明一个字符串 python str = 123 str = 123 Tips: 如果是三个引号的话,那么在py中就是注释的意思 ...
摘要:返回值,非必须,返回多个值使用逗号分隔即可。注意第一行末尾的分号无参数无返回值的函数该内容将演示函数的使用便捷性。函数的返回值可以赋值给一个变量,通过打印该变量,即可知道返回的具体内容。先学习一下局部变量与全局变量。 Python 学习的第一个难关 -- 函数,这个地方学会的人觉得没有啥,没学过的学的时候迷迷瞪...
摘要:在这里我分享下我个人入门机器学习的经历,希望能对大家能有所帮助。相关学习链接,,入门后的体验在入门了机器学习之后,在实际工作中,绝大多数的情况下你并不需要去创造一个新的算法。 机器学习在很多眼里就是香饽饽,因为机器学习相关的岗位在当前市场待遇不错,但同时机器学习在很多人面前又是一座大山,因为发现它太难学了。在这里我分享下我个人入门机器学习的经历,希望能对大家能有所帮助。 PS:这篇文章...
阅读 3881·2021-11-24 11:14
阅读 3321·2021-11-22 13:53
阅读 3883·2021-11-11 16:54
阅读 1546·2021-10-13 09:49
阅读 1211·2021-10-08 10:05
阅读 3392·2021-09-22 15:57
阅读 1754·2021-08-16 11:01
阅读 965·2019-08-30 15:55