内容目录
In [2]:
nums = list()
nums.append(1)
nums.append('2')
print(nums)
[1, '2']
序列的abc继承关系¶
(略)此处内容可以通过查看collection中序列的源码来了解
序列的+、+=和extend的区别¶
In [11]:
# +的使用
a = [1, 2]
c = a + [3, 4] # 使用+拼接的时候会形成新的序列
# d = a + (3, 4) # 使用+拼接时,序列的数据类型需要一致,否则报错
print(c)
print(a)
# +=的使用
a += [3, 4] # +=可以添加任意数据类型,其本质上调用序列类中的__iadd__方法,其内部是通过extend()实现
print(a)
a += (3, 4)
print(a)
# extend的使用
a.extend((5, 6)) # extend接收的是一个迭代对象
print(a)
a.append([7, 8])
print(a)
[1, 2, 3, 4] [1, 2] [1, 2, 3, 4] [1, 2, 3, 4, 3, 4] [1, 2, 3, 4, 3, 4, 5, 6] [1, 2, 3, 4, 3, 4, 5, 6, [7, 8]]
实现可切片的对象¶
In [9]:
data_list = [i for i in range(1, 21)]
# 切片的常规操作
print(data_list[::])
print(data_list[::-1]) # 倒序输出
print(data_list[::2]) # 当前步长为2,获取列表下标为偶数的元素
print(data_list[:10]) # 获取到元素下标为10之前的元素
print(data_list[1:10]) # 从下标1开始取元素
# 在列表元素开头插入数据
data_list[:0] = ['a', 'b', 'c']
print(data_list)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] [20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1] [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [2, 3, 4, 5, 6, 7, 8, 9, 10] ['a', 'b', 'c', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
In [21]:
# 自定义支持切片的序列类
from collections import abc
class PersonGroup:
def __init__(self, group_name, school_name, staffs:list):
self.group_name = group_name
self.school_name = school_name
self.staffs = staffs
def __reversed__(self):
return self.staffs.reverse()
# 实现切片的关键方法
def __getitem__(self, item):
cls = type(self)
if isinstance(item, slice):
# return self.staffs[item]
return cls(group_name=self.group_name, school_name=self.school_name, staffs=self.staffs[item])
return cls(group_name=self.group_name, school_name=self.school_name, staffs=[self.staffs[item]])
def __contains__(self, item):
if item in self.staffs:
return True
return False
def __len__(self):
return len(self.staffs)
def __iter__(self):
return iter(self.staffs)
stu_group = PersonGroup('Python学习小组', '兰州大学', ['小明', '小红', '大熊'])
# print(stu_group[::2])
# print(stu_group[::-1])
print(stu_group[1].staffs)
print(stu_group.staffs[:])
if '夏洛' in stu_group:
print('在数组中')
else:
print('不在数组中')
['小红'] ['小明', '小红', '大熊'] 不在数组中
bisect管理可排序序列¶
In [24]:
import bisect
# 可以使用二分查找方式完成序列的排序以及元素插入
int_list = []
bisect.insort(int_list, 5)
bisect.insort(int_list, 1)
bisect.insort(int_list, 3)
bisect.insort(int_list, 2)
bisect.insort(int_list, 4)
print(int_list)
# 插入新元素并返回插入元素的下标
print(bisect.bisect(int_list, 6))
print(bisect.bisect_left(int_list, 6))
[1, 2, 3, 4, 5] 5 5
什么时候我们不该用列表¶
In [32]:
import array
# array只能存放指定类型的数据,数组的性能要比列表高很多
my_array = array.array('i')
my_array.append(6)
my_array.append(4)
print(my_array)
for item in my_array:
print(item)
# my_array.append('1') # 传入字符串与整形数据类型不匹配,会报错
array('i', [6, 4]) 6 4
列表推导式、生成器表达式、字典推导式¶
In [36]:
# 列表推导式
int_list = [i for i in range(1, 21)]
print(int_list)
int_list = [i for i in range(1, 21) if i % 2!= 0]
print(int_list)
def handle_item(item):
return item * item
# 结合函数使用列表推导式
int_list_2 = [handle_item(i) for i in range(1, 21) if i % 2 != 0]
print(int_list_2)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] [1, 9, 25, 49, 81, 121, 169, 225, 289, 361]
In [43]:
# 生成器推导式
int_gen = (i for i in range(1, 21) if i % 2!= 0)
print(int_gen)
print(next(int_gen))
print(list(int_gen))
<generator object <genexpr> at 0x115bf86c0> 1 [3, 5, 7, 9, 11, 13, 15, 17, 19]
In [44]:
# 字典推导式
my_dict = {'name': '小明', 'age': 18, 'address': '北京'}
reversed_my_dict = {value: key for key, value in my_dict.items()}
print(reversed_my_dict)
{'小明': 'name', 18: 'age', '北京': 'address'}
In [45]:
# 集合推导式
int_set = {i for i in range(1, 21) if i % 2 != 0}
print(int_set)
{1, 3, 5, 7, 9, 11, 13, 15, 17, 19}
In [ ]: