python容器及简单使用

  1. 列表 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的最后一个元素
  1. 字典 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)
  1. 集合 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)
  1. 切片
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]
  1. 列表推导
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}
  1. 生成器
  • 问题的提出
    创建一个巨大的列表而仅仅需要访问其中少量几个元素。
    如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的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)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。