python

您所在的位置:网站首页 python列表首添加元素 python

python

2024-05-29 13:14| 来源: 网络整理| 查看: 265

文章目录 一、列表元素的添加1. list.append()2. list.extend()3. list.insert() 二、列表元素的删除1. del list[index]2. list.remove(obj)3. list.pop(index) 三、删除重复元素1. 通过集合(set)转换2. 通过字典键值(key)转换3. 使用numpy中的unique去重4. 循环判断5. 排序以后相邻元素比较 四、列表的拷贝(复制)1. 直接赋值2. 浅拷贝3. 深拷贝

参考链接: python 列表1 python 列表2

一、列表元素的添加 1. list.append()

append()方法在列表末尾添加一个元素,例如:

list1 = ['a'] print(list1) list1.append('b') print(list1)

打印结果如下:

[‘a’] [‘a’, ‘b’]

上述例子中添加的都是字符串元素,也可以添加不同类型的,如数值,或者列表元素,如下所示:

list1 = ['a'] print(list1) list1.append('b') print(list1) list1.append(88) print(list1) list1.append(['c']) print(list1)

结果如下:

[‘a’] [‘a’, ‘b’] [‘a’, ‘b’, 88] [‘a’, ‘b’, 88, [‘c’]]

2. list.extend()

extend()也是在列表的末尾添加元素,与append()方法不同的是,extend()方法可以添加单个或者多个元素。但是需要注意的是单个元素添加方法与append()方法一样,而多个元素添加时需要元素本身组成一个列表的形式。例如:

list1 = ['a'] list1.append('b') print(list1) list2 = [] list2.extend('c') print(list2) list2.extend(list1) print(list2)

结果如下,可以看出extend()方法在添加多个元素组成的列表时,将列表中的元素取出,然后按照顺序依次添加到目标列表中。而在append()方法中,遇到添加的元素是列表形式时,直接将其当作一个元素添加进去。

[‘a’, ‘b’] [‘c’] [‘c’, ‘a’, ‘b’]

3. list.insert()

list.insert(index, obj) insert()方法在列表索引值index位置之前插入元素。

list1 = ['a','b','c'] list1.insert(0,'d') print(list1)

结果:

[‘d’, ‘a’, ‘b’, ‘c’]

二、列表元素的删除 1. del list[index]

删除列表中某个索引处的元素,如下:

list1 = ['a','b','c','d','a','b'] print(list1) del list1[2] print(list1)

结果如下,原来索引值2的位置时元素‘c’,执行以后被删除了。

[‘a’, ‘b’, ‘c’, ‘d’, ‘a’, ‘b’] [‘a’, ‘b’, ‘d’, ‘a’, ‘b’]

2. list.remove(obj)

删除列表中第一个符合条件的元素,例如:

list1 = ['a','b','c','d','a','b'] print(list1) del list1[2] print(list1) list1.remove('b') print(list1)

结果如下,remove之前,列表中有两个‘b’,执行remove之后第一个’b’被删除了。 这里可能会联想到如何删除重复的元素呢?这里后面再讲。

[‘a’, ‘b’, ‘c’, ‘d’, ‘a’, ‘b’] [‘a’, ‘b’, ‘d’, ‘a’, ‘b’] [‘a’, ‘d’, ‘a’, ‘b’]

3. list.pop(index)

删除指定位置的元素,没有指定删除的索引值时默认删除末尾的元素

list1 = ['a','b','c','d','a','b'] print(list1) res = list1.pop() print(list1) print(res) res = list1.pop(2) print(list1) print(res)

结果如下,函数返回值是删除的元素。

[‘a’, ‘b’, ‘c’, ‘d’, ‘a’, ‘b’] [‘a’, ‘b’, ‘c’, ‘d’, ‘a’] b [‘a’, ‘b’, ‘d’, ‘a’] c

三、删除重复元素

参考: python删除列表重复元素 python四种方法实现去除列表中的重复元素

1. 通过集合(set)转换

集合没有重复元素,因此先转换为集合自动删除重复元素,然后再转换为列表。 该方法的优点是使用简单,缺点是元素顺序打乱了。

list1 = ['9','8','9','3','6','6','3','8'] print(list1) list2 = list(set(list1)) print(list2)

结果如下,集合删除重复元素看起来没有什么规律:

[‘9’, ‘8’, ‘9’, ‘3’, ‘6’, ‘6’, ‘3’, ‘8’] [‘9’, ‘3’, ‘6’, ‘8’]

2. 通过字典键值(key)转换

先将列表中的元素转换为一个字典的关键字(dict.fromkeys),由于字典关键字是唯一的,因此可以自动去重。然后获取该字典中的关键字(dict.keys),最后将其转换为列表即可。如下:

list1 = ['9','8','9','3','6','6','3','8'] print(list1) list2 = dict.fromkeys(list1).keys() print(list2) list2 = list(list2) print(list2)

结果如下,dict.keys()获取的字典关键字类型是dict_keys,因此还需要进行列表转换。

[‘9’, ‘8’, ‘9’, ‘3’, ‘6’, ‘6’, ‘3’, ‘8’] dict_keys([‘9’, ‘8’, ‘3’, ‘6’]) [‘9’, ‘8’, ‘3’, ‘6’]

3. 使用numpy中的unique去重

先通过np.unique()去除重复元素,再通过将结果由numpy数组转换为list。

import numpy as np list1 = ['9','8','9','3','6','6','3','8'] print(list1) list2 = list(np.unique(list1)) print(list2)

结果:

[‘9’, ‘8’, ‘9’, ‘3’, ‘6’, ‘6’, ‘3’, ‘8’] [‘3’, ‘6’, ‘8’, ‘9’]

4. 循环判断

通过判断元素是否在新列表中,从而为新列表添加元素。 方法的优点是元素顺序仍然保留,缺点是时间复杂度比较大。

list1 = ['9','8','9','3','6','6','3','8'] print(list1) list2 = [] for obj in list1: if obj not in list2: list2.append(obj) print(list2)

结果:

[‘9’, ‘8’, ‘9’, ‘3’, ‘6’, ‘6’, ‘3’, ‘8’] [‘9’, ‘8’, ‘3’, ‘6’]

5. 排序以后相邻元素比较

先对列表元素进行排序,排序以后重复元素会相邻,于是可以循环判断相邻元素是否相等来操作。 此处笔者是先将重复的元素前一个设置成空值,然后再判断空值从而删除。 该方法的好处是不用另外开辟空间存储新列表,且时间复杂度比较低(排序部分未计入);缺点就是原先元素的顺序因排序被打乱。

list1 = ['9','8','9','3','6','6','3','8'] print(list1) list1.sort() for i in range(len(list1)-1): if list1[i] == list1[i+1]: list1[i] = '' for obj in list1: if obj == '': list1.remove(obj) print(list1)

或者还有一种办法,从列表末尾往前遍历,直接删除重复的元素,这样在删除重复元素以后不会影响前面的索引值,如下:

list1 = ['9','8','9','3','6','6','3','8'] print(list1) list1.sort() for i in range(len(list1)-2,-1,-1): if list1[i+1] == list1[i]: list1.remove(list1[i+1]) print(list1)

两种方法的结果都是:

[‘9’, ‘8’, ‘9’, ‘3’, ‘6’, ‘6’, ‘3’, ‘8’] [‘3’, ‘6’, ‘8’, ‘9’]

四、列表的拷贝(复制)

更新一个列表复制的好文:正确复制列表的方法

1. 直接赋值 list1 = [1, 2, 3] list2 = list1 print(list1) print(list2) list1.remove(1) print(list1) print(list2)

上述代码中用list1赋值list2,之后删除list1中的元素,会发现list2也跟随变化,结果如下:

[1, 2, 3] [1, 2, 3] [2, 3] [2, 3]

两个列表直接赋值,其实指向的是同一个地址,因此修改一个会导致另一个发生改变。 这样的结果其实不是我们愿意看到的,那么有没有办法让两个列表分别变成独立变量呢?这便涉及到了拷贝。我们先来看看浅拷贝。

2. 浅拷贝

python3中list有个copy()的方法,我们先来试试看:

list1 = [1, 2, 3] list2 = list1.copy() list1.remove(1) print(list1) print(list2)

结果如下:

[2, 3] [1, 2, 3]

我们惊喜的发现,用copy()的方法可以实现两个list相互独立,那么是不是这样就可以了呢?别急,往后看。 我们再来看一个例子;

list1 = [1, [1, 2, 3], 3] list2 = list1.copy() list1.remove(3) list1[1][0] =3 print(list1) print(list2)

list1是一个嵌套列表,其中包含列表元素,我们先删除其中元素3,然后修改嵌套列表中的1为3,结果如下:

[1, [3, 2, 3]] [1, [3, 2, 3], 3]

理论上list2的结果应该是[1, [1, 2, 3], 3]对不对,而实际上结果却是list2的嵌套列表中的元素会随list1而改变,这意味着copy()其实只是外层元素的拷贝,嵌套列表元素还是赋值的形式。这是什么原因呢?我们想想,前面我们说直接赋值其实是将两个变量指向了同一个地址,那么内容改变的话,两个变量都会发生改变。回到这里就好解释了,嵌套列表存储的实际是列表的地址,因此list1和list2的内存列表指向的是同一个地址。

了解了上述原理之后,我们就可以知道,其他的诸如列表生成式、for循环或者切片方式(参考文末链接),这些基本都是浅拷贝,原理都是嵌套列表保存的是地址。到这里你可能想问,既然有浅拷贝,那是不是有深拷贝呢?是不是有方法可以将两个不论多少层嵌套的列表相互独立呢?有的!

3. 深拷贝

深拷贝的实现要借助copy包中的deepcopy()方法,例子如下:

import copy list1 = [1, [1, 2, 3], 3] list2 = copy.deepcopy(list1) list1.remove(3) list1[1][0] =3 print(list1) print(list2)

结果如下:

[1, [3, 2, 3]] [1, [1, 2, 3], 3]

参考链接: https://www.cnblogs.com/Black-rainbow/p/9577029.html https://www.runoob.com/python3/python3-list.html



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3