列表
列表
介绍列表的方法及示例演示其使用,包括:长度、修改列表、取值、排序
创建列表
empty_list = list()
print(empty_list) # 同 empty_list = []
'''
[]是解析后的list,所以[]比list()更快
'''
查看列表长度:
# len 查看列表长度
a = [1, 2, 3]
b = [2, 3, 'hello']
c = a + b
print(c) # [1, 2, 3, 2, 3, u'hello']
len(c)
Python字符串可以和列表可以方便扩展:
d = b * 2
print(d) # [2, 3, u'hello', 2, 3, u'hello']
d[-1]
修改列表
print(a)
a[0] = 100
a
这种赋值也适用于分片,例如,将列表的第2,3两个元素换掉:
a[1:3] = [200, 300]
print(a)
事实上,对于连续的分片(即步长为 1 ),Python采用的是整段替换的方法,两者的元素个数并不需要相同,
# 例如,将 [11,12] 替换为 [1,2,3,4]:
a = [10, 11, 12, 13, 14]
a[1:3] = [1, 2, 3, 4]
print(a) # [10, 1, 2, 3, 4, 13, 14]
用这种方法来删除列表中一个连续的分片:
a = [10, 1, 2, 11, 12]
print(a[1:3])
a[1:3] = []
print(a)
对于不连续(间隔step不为1)的片段进行修改时,两者的元素数目必须一致:
a = [10, 11, 12, 13, 14]
a[::2] = [1, 2, 3]
print(a) # [1, 11, 2, 13, 3]
Python提供了删除列表中元素的方法 'del':
a = [100, 'a', 'b', 200]
del a[0]
print(a) # [u'a', u'b', 200]
# 删除间隔的元素:
a = ['a', 1, 'b', 2, 'c']
del a[::2]
print(a) # [1, 2]
用 in 来看某个元素是否在某个序列(不仅仅是列表)中, 用not in来判断是否不在某个序列中。
a = [1, 2, 3, 4, 5]
print(1 in a)
print(1 not in a)
# 也可以作用于字符串:
s = 'hello world'
print("'he' in s : ", 'he' in s) # True
print("'world' not in s : ", 'world' not in s) # False
列表中可以包含各种对象,甚至可以包含列表:
a = [1, 2, 'six', [3, 4]]
print(a[3]) # [3,4]
# a[3]是列表,可以对它再进行索引:
print(a[3][1]) # 4
列表方法
# 列表中某个元素个数
a = [1, 1, 2, 3, 4, 5]
print(len(a)) # 总个数:6
# 元素1出现的个数
print(a.count(1)) # 2
# l.index(ob) 返回列表中元素 ob 第一次出现的索引位置,如果 ob 不在 l 中会报错。
print(a.index(1)) # 0
列表添加元素
# 向列表添加单个元素
# a.append(ob) 将元素 ob 添加到列表 a 的最后。
a = [1, 1, 2, 3, 4, 5]
a.append(10)
print(a) # [1, 1, 2, 3, 4, 5, 10]
# append每次只添加一个元素,并不会因为这个元素是序列而将其展开:
a.append([11, 12])
print(a) # [1, 1, 2, 3, 4, 5, 10, [11, 12]]
# 向列表添加序列
# l.extend(lst) 将序列 lst 的元素依次添加到列表 l 的最后,作用相当于 l += lst。
a = [1, 2, 3, 4]
a.extend([6, 7, 1])
print(a) # [1, 2, 3, 4, 6, 7, 1]
# 插入元素
# l.insert(idx, ob) 在索引 idx 处插入 ob ,之后的元素依次后移。
a = [1, 2, 3, 4]
# 在索引 3 插入 'a'
a.insert(3, 'a')
print(a) # [1, 2, 3, u'a', 4]
a
移除元素
# l.remove(ob) 会将列表中第一个出现的 ob 删除,如果 ob 不在 l 中会报错。
a = [1, 1, 2, 3, 4]
# 移除第一个1
a.remove(1)
print(a) # [1, 2, 3, 4]
# 弹出元素
# l.pop(idx) 会将索引 idx 处的元素删除,并返回这个元素。
a = [1, 2, 3, 4]
b = a.pop(0) # 1
print('pop:', b, ' ;result:', a)
排序
# l.sort() 会将列表中的元素按照一定的规则排序:
a = [10, 1, 11, 13, 11, 2]
a.sort()
print(a) # [1, 2, 10, 11, 11, 13]
# 如果不想改变原来列表中的值,可以使用 sorted 函数:
a = [10, 1, 11, 13, 11, 2]
b = sorted(a)
print(a) # [10, 1, 11, 13, 11, 2]
print(b) # [1, 2, 10, 11, 11, 13]
# 列表反向
# list.reverse() 会将列表中的元素从后向前排列。
a = [1, 2, 3, 4, 5, 6]
a.reverse()
print(a) # [6, 5, 4, 3, 2, 1]
# 如果不想改变原来列表中的值,可以使用这样的方法:
a = [1, 2, 3, 4, 5, 6]
b = a[::-1]
print(a)
print(b)
a
如果不清楚用法,可以查看帮助: help(a.sort)
a=[1,2,3]
help(a.sort)
显示帮助:
# Signature: a.sort(*, key=None, reverse=False)
# Docstring:
# Sort the list in ascending order and return None.
#
# The sort is in-place (i.e. the list itself is modified) and stable (i.e. the
# order of two equal elements is maintained).
#
# If a key function is given, apply it once to each list item and sort them,
# ascending or descending, according to their function values.
#
# The reverse flag can be set to sort in descending order.
# Type: builtin_function_or_method
列表推导式
循环可以用来生成列表:
values = [2, 2, 3]
squares = []
for x in values:
squares.append(x ** 2)
print(squares) # [4, 4, 9]
列表推导式可以使用更简单的方法来创建这个列表:
values = [3, 8, 10, 14]
squares = [x ** 2 for x in values]
print(squares) # [9, 64, 100, 196]
可以加入条件筛选,在上面的例子中,
假如只想保留列表中不大于8的数的平方:
squares = [x ** 2 for x in values if x <= 10]
print(squares) # [9, 64, 100]
平方的结果不大于100的:
squares = [x ** 2 for x in values if x ** 2 <= 80]
print(squares) # [9, 64]
使用推导式生成集合和字典:
values = [10, 21, 4, 7, 12]
square_set = {x ** 2 for x in values if x <= 10}
print(square_set) # set([16, 49, 100])
square_dict = {x: x ** 2 for x in values if x <= 10}
print(square_dict) # {10: 100, 4: 16, 7: 49}
计算上面例 子中生成的列表中所有元素的和:
total = sum([x ** 2 for x in values if x < 10])
total # 65
但是,Python会生成这个列表,然后在将它放到垃圾回收机制中(因为没有变量指向它),
这毫无疑问是种浪费。
为了解决这种问题,与range()类似,Python使用产生式表达式来解决这个问题:
total = sum(x ** 2 for x in values if x < 10)
total # 65
与上面相比,只是去掉了括号,但这里并不会一次性的生成这个列表。
import time
# 比较一下两者的用时:
x = range(1000000)
t1 = time.time()
total = sum([x ** 3 for x in values if x < 10])
print("list speed: ", time.time() - t1)
t2 = time.time()
total = sum(x ** 3 for x in values if x < 10)
print("comprehension speed:", time.time() - t2)
ipython 下可以输入:
x = range(1000000)
%timeit total = sum([i**2 for i in x])
%timeit total = sum(i**2 for i in x)
列表vs字符串
列表是可变的(Mutable)
a = [1, 2, 3, 4]
a[0] = 100
a.insert(3, 200)
a # [100, 2, 3, 200, 4]
字符串是不可变的(Immutable):
s = "hello world"
# 通过索引改变会报错
s[0] = 'k'
s.insert(3, 'm')
字符串方法只是返回一个新字符串,并不改变原来的值:
print(s.replace('world', 'Mars')) # hello Mars
print(s) # hello world
# 如果想改变字符串的值,可以用重新赋值的方法:
s = s.replace('world', 'YunYun')
print(s) # hello YunYun