Python list

来源:互联网 发布:游族网络(002174)股吧 编辑:程序博客网 时间:2024/05/21 07:49
从功能上看,列表 (list) 类似 Vector,⽽而⾮非数组或链表。
• 列表对象和存储元素指针的数组是分开的两块内存,后者在堆上分配。
• 虚拟机会保留 80 个列表复⽤用对象,但其元素指针数组会被释放。
• 列表会动态调整指针数组⼤大⼩小,预分配内存多于实际元素数量。
创建列表:
>>> []? ? ? ? ? ? ? ? # 空列表。
[]
>>> ['a', 'b'] * 3? ? ? ? ? ? # 这个少⻅见吧。
['a', 'b', 'a', 'b', 'a', 'b']
>>> ['a', 'b'] + ['c', 'd']? ? ? ? # 连接多个列表。
['a', 'b', 'c', 'd']
>>> list("abcd")? ? ? ? ? ? # 将序列类型或迭代器转换为列表。
['a', 'b', 'c', 'd']
>>> [x for x in range(3)]?? ? ? ? # ⽣生成器表达式。
[0, 1, 2]
常⻅见操作:
>>> l = list("abc")
>>> l[1] = 2?? ? ? ? ? ? # 按序号读写。
>>> l? ? ? ? ? ? ? ?
['a', 2, 'c']
>>> l = list(xrange(10))
>>> l[2:-2]? ? ? ? ? ? ? # 切⽚片。
[2, 3, 4, 5, 6, 7]
>>> l = list("abcabc")
>>> l.count("b")? ? ? ? ? ? # 统计元素项。
2
>>> l = list("abcabc")
>>> l.index("a", 2)? ? ? ? ? ? # 从指定位置查找项,返回序号。
3
>>> l = list("abc")
>>> l.append("d")
>>> l? ? ? ? ? ? ? ? # 追加元素。
['a', 'b', 'c', 'd']
33
>>> l = list("abc")
>>> l.insert(1, 100)? ? ? ? ? # 在指定位置插⼊入元素。
>>> l? ?
['a', 100, 'b', 'c']
>>> l = list("abc")
>>> l.extend(range(3))? ? ? ? ? # 合并列表。
>>> l? ?
['a', 'b', 'c', 0, 1, 2]
>>> l = list("abcabc")
>>> l.remove("b")? ? ? ? ? ? # 移除第⼀一个指定元素。
>>> l? ?
['a', 'c', 'a', 'b', 'c']
>>> l = list("abc")
>>> l.pop(1)?? ? ? ? ? ? # 弹出指定位置的元素 (默认最后项)。
'b'
>>> l? ? ? ?
['a', 'c']
可⽤用 bisect 向有序列表中插⼊入元素。
>>> import bisect
>>> l = ["a", "d", "c", "e"]
>>> l.sort()
>>> l
['a', 'c', 'd', 'e']
>>> bisect.insort(l, "b")
>>> l
['a', 'b', 'c', 'd', 'e']
>>> bisect.insort(l, "d")
>>> l
['a', 'b', 'c', 'd', 'd', 'e']
性能
列表⽤用 realloc() 调整指针数组内存⼤大⼩小,可能需要复制数据。插⼊入和删除操作,还会循环移动后
续元素。这些都是潜在的性能隐患。对于频繁增删元素的⼤大型列表,应该考虑⽤用链表等数据结构代
替。
下⾯面的例⼦子测试了两种创建列表对象⽅方式的性能差异。为获得更好测试结果,我们关掉 GC,元素
使⽤用同⼀一个⼩小整数对象,减少其他干扰因素。
34
>>> import itertools, gc
>>> gc.disable()
>>> def test(n):
... return len([0 for i in xrange(n)])? ? # 先创建列表,然后 append。
>>> def test2(n):
... return len(list(itertools.repeat(0, n)))? # 按照迭代器创建列表对象,⼀一次分配内存。
>>> timeit test(10000)
1000 loops, best of 3: 810 us per loop
>>> timeit test2(10000)
10000 loops, best of 3: 89.5 us per loop
从测试结果来看,性能差异⾮非常⼤大。
某些时候,可以考虑⽤用数组代替列表。 和列表存储对象指针不同,数组直接内嵌数据,既省了创建
对象的内存开销,⼜又提升了读写效率。
>>> import array
>>> a = array.array("l", range(10))? ? # ⽤用其他序列类型初始化数组。
>>> a
array('l', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a.tolist()? ? ? ? ? # 转换为列表。
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a = array.array("c")? ? ? ? # 创建特定类型数组。
>>> a.fromstring("abc")? ? ? ? # 从字符串添加元素。
>>> a
array('c', 'abc')
>>> a.fromlist(list("def"))? ? ? # 从列表添加元素。
>>> a
array('c', 'abcdef')
>>> a.extend(array.array("c", "xyz"))? ? # 合并列表或数组。
>>> a
array('c', 'abcdefxyz')
0 0
原创粉丝点击