ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python list列表常用方法及其底层实现

2021-12-07 15:31:57  阅读:169  来源: 互联网

标签:Python 元素 list ob 列表 print test


添加元素

append()
方法用于在列表的末尾追加元素

list_test = ['2','a','b']
#追加元素
list_test.append(1)
print(list_test)

#整个元素被当作一个元素
list_test.append(('e',))
print(list_test)

结果
['2', 'a', 'b', 1]
['2', 'a', 'b', 1, ('e',)]

当给 append() 方法传递列表或者元组时,此方法会将它们视为一个整体,作为一个元素添加到列表中,从而形成包含列表和元组的新列表。

extend()
extend() 和 append() 的不同之处在于:extend() 不会把列表或者元祖视为一个整体,而是把它们包含的元素逐个添加到列表中。

list_test = ['2','a','b']
#追加元素
list_test.extend('1')
print(list_test)

#整个元素被当作一个元素
list_test.extend(('e',))
print(list_test)

结果
['2', 'a', 'b', '1']
['2', 'a', 'b', '1', 'e']

这里需要注意的时extend相当于一个迭代器一样把数据逐个添加到指定列表中

insert()
append() 和 extend() 方法只能在列表末尾插入元素,如果希望在列表中间某个位置插入元素,那么可以使用 insert() 方法。

list_test = ['2','a','b']
#追加元素
list_test.insert(0,'1')
print(list_test)

list_test.insert(1,('e',))
print(list_test)

结果
['1', '2', 'a', 'b']
['1', ('e',), '2', 'a', 'b']

删除元素

del

del 是 Python 中的关键字,专门用来执行删除操作,它不仅可以删除整个列表,还可以删除列表中的某些元素

list_test = ['2','a','b']
#根据索引
del list_test[0]
print(list_test)

#删除连续的一段
del list_test[::-1]
print(list_test)

结果
['a', 'b']
[]

pop()
根据索引值删除元素

list_test = ['2','a','b']
list_test.pop(0)
print(list_test)

#不指定索引
list_test.pop()
print(list_test)

结果
['a', 'b']
[]

remove()
根据元素值进行删除
除了 del 关键字,Python 还提供了 remove() 方法,该方法会根据元素本身的值来进行删除操作。

需要注意的是,remove() 方法只会删除第一个和指定值相同的元素,而且必须保证该元素是存在的,否则会引发 ValueError 错误。

list_test = ['2','a','b']
list_test.remove('a')
print(list_test)

#不指定索引
list_test.remove('c')
print(list_test)

结果
['2', 'b']
ValueError: list.remove(x): x not in list

clear()
删除列表所有元素
Python clear() 用来删除列表的所有元素,也即清空列表

list_test = ['2','a','b']
list_test.clear()
print(list_test)

结果
[]

修改元素

修改单个元素,直接对元素赋值即可

修改单个元素

list_test = ['2','a','b']
list_test[0]='1'
print(list_test)

结果
['1', 'a', 'b']

修改一组元素
Python 支持通过切片语法给一组元素赋值。在进行这种操作时,如果不指定步长,Python 就不要求新赋值的元素个数与原来的元素个数相同;这意味,该操作既可以为列表添加元素,也可以为列表删除元素。

list_test = ['2','a','b','v']
list_test[0:2]=['c','d','e']
print(list_test)

结果
['c', 'd', 'e', 'b', 'v']

查找元素

**index() **
index() 方法会返回元素所在列表中的索引值。
index() 方法用来查找某个元素在列表中出现的位置(也就是索引),如果该元素不存在,则会导致 ValueError 错误,所以在查找之前最好使用 count() 方法判断一下。

list_test = ['2','a','b']
print(list_test.index('a'))
print(list_test.index('a',0,2))

结果
1
1

count()
count() 方法用来统计某个元素在列表中出现的次数

list_test = ['2','a','b']
print(list_test.count('a'))

结果
1

列表的底层实现简述

具体结构如下

typedef struct {
    PyObject_VAR_HEAD
    /* Vector of pointers to list elements.  list[0] is ob_item[0], etc. */
    PyObject **ob_item;
    /* ob_item contains space for 'allocated' elements.  The number
     * currently in use is ob_size.
     * Invariants:
     *     0 <= ob_size <= allocated
     *     len(list) == ob_size
     *     ob_item == NULL implies ob_size == allocated == 0
     * list.sort() temporarily sets allocated to -1 to detect mutations.
     *
     * Items must normally not be NULL, except during construction when
     * the list is not yet visible outside the function that builds it.
     */
    Py_ssize_t allocated;
} PyListObject;

列表本质上是一个长度可变的连续数组。其中ob_item是一个指针列表,里面的每一个指针都指向列表中的元素,而allocated则用于存储该列表目前已经被分配空间的大小

需要注意的是,allocated和列表的实际空间大小不同,列表实际空间大小,指的是len(list)返回的结果,也就是上面代码中注释的ob_size,表示该列表总共存储了多少元素。而在实际情况中,为了优化存储结构,避免每次增加元素都要重新分配内存,列表预分配的空间allocated往往会大于ob_size

因此 allocated 和 ob_size 的关系是:allocated >= len(list) = ob_size >= 0。

如果当前列表分配的空间已满(即 allocated == len(list)),则会向系统请求更大的内存空间,并把原来的元素全部拷贝过去。

标签:Python,元素,list,ob,列表,print,test
来源: https://blog.csdn.net/weixin_47906106/article/details/121768171

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有