- 列表 list
- 序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。
- 列表的数据项不需要具有相同的类型
li = [1, 2, 3, [4, 5, 6], {7: 'I', 8: 'LOVE', 9: 'YOU'}]
print(li[0]) # 打印第一个元素
print(li[-1]) # 打印最后一个元素
print(li[-2]) # 打印倒数第二个元素
li.append('5') # 添加一个元素
li.extend([4,5,6,78]) # 拓宽list,添加多个元素
print(li.index(1)) # 打印出元素所在的索引
del(li[-1]) # 删除li的最后一个元素
- 字典 dict
字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中。
d = {1: '111', 2: "222", 3: '333'} # 定义一个字典,字典的key和value 可以是任意值
# 根据key查找
print(d[2])
# 判断key是够存在
print(1 in d)
# 删除键值对
del(d[1])
print(d)
# 添加元素
d[4] = '444'
d['a'] = 'aaaaaaa'
# 两种遍历的方法
for key in d.keys():
print(d[key])
for key,value in d.items():
print(key,value)
- 集合 set
是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等数学运算。
s_a = set([1, 1, 2, 2, 3, 4, 5])
s_b = set([3, 4, 5, 6, 7, 8])
print(s_a) # 在集合当中不允许有重复,会自动剔除重复元素
print(s_b)
# 判断元素是否存在
print(1 in s_a)
print(1 in s_b)
# 并集
print(s_a | s_b)
print(s_a.union(s_b))
# 交集
print(s_a & s_b)
print(s_a.intersection(s_b))
# 差集 A-(A&B)
print(s_a - s_b)
print(s_a.difference(s_b))
# 对称差:去除两个集合的相同部分 (A|B)-(A&B)
print(s_a^s_b)
print(s_a.symmetric_difference(s_b))
# 添加元素
s_a.add(555) # 添加一个元素
s_a.update([999,888]) # 添加多个元素
# 删除元素
s_a.remove(1) # 指定对应的元素进行删除
# 遍历
for i in s_a:
print(i)
- 切片
li = list(range(10)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 切片 (start:end:steps) >=start & < end 默认:start=0;end=最后一个数;steps=1
print(li[2:5]) # [2, 3, 4]
print(li[::2])
print(li[:4:])
# 负数如何处理
print(li[5:-2]) # [ 5, 6, 7]
print(li[9:0:-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1]
print(li[9::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
print(li[::-2]) # [9, 7, 5, 3, 1]
# 切片生成一个新的对象
print(li) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- 列表推导
li = list(range(10)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
li = [0] * 10 # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 这里做的是深拷贝,即改变其中一个元素的值,其他不受影响
li[0] = 1 # [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
li = [i*2 for i in range(10)] # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 如果用如下的方法定义一个全部为1的二维数组,将会是浅拷贝
li_2d = [[1] * 3] * 3
print(li_2d) # [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
li_2d[0][0] = 2
print(li_2d) # [[2, 1, 1], [2, 1, 1], [2, 1, 1]]
# 可以使用如下的方法定义一个全为1的二维数组,这样做将会是深拷贝
li_2d = [[1]*3 for i in range(3)]
print(li_2d) # [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
li_2d[0][0] = 2
print(li_2d) # [[2, 1, 1], [1, 1, 1], [1, 1, 1]]
# 在python3之后 集合set和字典也可以使用推导的方法
s = {x for x in range(20) if x % 2 == 0}
print(s) # {0, 2, 4, 6, 8, 10, 12, 14, 16, 18}
d = {x : x % 2 ==0 for x in range(10)}
print(d) # {0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False}
- 生成器
- 问题的提出
创建一个巨大的列表而仅仅需要访问其中少量几个元素。
如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。
- 遍历:next或者for循环。
square_generator = (x * x for x in range(50000)) # 使用range作为生成器
print(type(square_generator))
for i in range(5):
print(next(square_generator)) # 用next 进行取前5个、
def fib(limit):
n, a, b = 0, 0, 1
while n < limit:
yield b
a, b = b, a + b
n += 1
return 'done'
f = fib(5)
print(type(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
for i in fib(5):
print(i)