list作为常用的数据结构之一,今天就其使用进行简单的总结:
(1)增
》append:
s1 = [1,2,3]
s2 = [4]
s1.append(s2)
s1.append({'1':'2'})
print(s1)
输出如下
[1,2,3,[4],{'1':'2'}]
使用append相当把整个s2当做List中的元素的内容,相当于把[s2]添加到了s1中。如果用print(s1.append(s2))输出的为None;用test =s1.append(s2)在print(s2)得到还是None,因为append操作是在原List上的修改,不会返回一个新的值
append 操作可以向List中添加任何元素,比如字典,不过字典整体作为List中的一个元素(比如上面字典的{})
》+运算:
s1 = [1,2,3]
s2 = [4]
print(s1+s2)
结果如下
[1,2,3,4]
+运算是对于两个类型相同的变量之间的运算,不改变原有的变量,并返回一个新的值,是内容之间的拼接
》extend:
s1 = [1,2,3]
s2 = [4]
s1.extend(s2)
print(s1)
s3 = 'abc'
s1.extend(s3))
print(s1)
s4 = {'age':12,'height':180}
s1.extend(s4)
print(s1)
输出如下:
[1, 2, 3, 4]
[1, 2, 3, 4, 'a', 'b', 'c']
[1, 2, 3, 4, 'a', 'b', 'c', 'height', 'age']
extend 也是在原有List上进行修改,没有返回值,可以扩展不同类型的变量,并将其内容以List变量的形式加入到原List中。
从输出中可见如果extend的是字符串,则字符串会被拆分成字符数组,如果extend的是字典,则字典的key会被加入到List中。
(2)删
tmp = [1,2,3]
以tmp为例,删除操作有如下几种,
》remove(val)
tmp.remove(1)
print(tmp) ###[2,3]
- remove() 的参数是具体的元素值,而不是索引,
- 如果知道索引,使用 remove 删除该索引上的元素值。
》pop
tmp.pop(-1)
print(tmp) ##[1,2]
- pop() 接收的是索引,无参的情况下删除的是最后一个元素,等价于pop(-1)(典型的栈的特性)
- pop() 存在返回值,返回的是删除的元素值
- list 的 append()(添加到尾部),pop()(从尾部弹出),成功地将 list 变成了 stack
》del
del(tmp[0]) ###[2,3]
补:去除list中的某个元素(可能存在重复)
###先去重再删除元素
tmp=[1,2,2,3]
tt=list(set(tmp))
for i in tt:
if i==2:
tt.remove(i)
print(tt)
###直接去除,注意这里while循环换成for循环后会出现删除不干净或溢出错误
tmp=[1,2,2,3]
i=0
while i<len(tmp):
if tmp[i]==2:
tmp.remove(tmp[i])
i-=1 ##回退一步,保证去除所有重复元素
i+=1
print(i)
(3)改
相对而言,list声明后结构大体分为3部分,变量名称--list对象(结构性数据+指针数组)--list内容,其中id表示的是list对象的位置,想要修改指定位置元素,可以通过下标进行索引,然后进行修改。如下,
tmp=[1,2,"23","34"]
tmp[2]=3 ##[1,2,3,"34"]
需要注意的是
a=b时,a和b指向同一个list对象
a=b[:]时,a的list对象和b的list对象指向同一个list内容
(4)查
由于list内置了iter函数,是可迭代对象,因此可以通过循环来实现对list内元素的遍历审查,需要注意的一点就是list嵌套情况处理,示例如下,
def printList(list1):
res=[]
for elements in list1:
if isinstance(elements,list) or isinstance(elements, tuple):
tt=printList(elements) #递归调用函数本身进行深层次的遍历
res.extend(tt)
elif isinstance(elements, dict): #由于dict类型中的键值key必须唯一,所以只能是不可变类型数据,所以这里不存在深层遍历dict键值的问题。
for i in elements.items():
res.extend(i)
else :
res.append(elements)
return res
list1 = [{"name":"jack",1:2},[[3.4j,["this","is","the","list"],(1,2,"adf")],3,4],'a','b',('a',"cc",'d'),1,{"name":"jack",1:2}]
res=printList(list1)
print(res)
补充:
在Python中,列表是一个动态的指针数组,而array模块所提供的array对象则是保存相同类型的数值的动态数组。由于array直接保存值,因此它所使用的内存比列表少。列表和array都是动态数组,因此往其中添加新元素,而没有空间保存新的元素时,它们会自动重新分配内存块,并将原来的内存中的值复制到新的内存块中。为了减少重新分配内存的次数,通常每次重新分配时,大小都为原来的k倍。k值越大,则重新分配内存的次数越少,但浪费的空间越多。对于list对象,其元素内容并不一定线性存储,但是由于内存分配的问题,会出现线性存储的假象,当元素出现容器或者相对前一个元素类型改变时,内存空间就会不再连续。