Python笔记3---列表,元组,字典,集合
列表及方法
列表是python内置的数据结构或者说是类型之一,可以包含各种数据类型作为元素.有点类似于C语言里的链表.
列表变量是一个引用,还好学过C语言,所以要注意,对于引用的修改就是用指针操作,会直接修改原本的列表对象,只有部分方法是不修改的.
list()用来转换列表,另外列表还有列表生成式,是非常灵活的写法,也是很python的写法.
除了正常的切片,索引,通过赋值修改某个位置的元素,in 等内置方法,还有list类的方法:
append(p_object) | 列表尾部追加一个元素.修改对象.返回None. |
---|---|
clear() | 删除列表里的所有元素,返回空列表,直接修改对象,返回None. |
copy() | 赋给一个新变量则得到当前列表的复制,是一个新列表,引用和原来的列表不同.注意这个方法得到的是浅拷贝 |
count(value) | 返回value在列表元素中出现的整型次数,不修改原列表 |
extend(iterable) | 将一个可迭代对象iterable里的元素增加到列表里.例如b.extend(range(10,21)),本身返回None |
index(value, start=None, stop=None) | 查找值返回索引整型,如果没有会报ValueError |
insert(index, p_object) | 在指定的索引位置插入元素,该索引位置上的原来元素及后边元素向后移动 |
pop(index=None) | 弹出某一个索引的元素,返回这个元素,同时将这个元素从原列表里删除,如果不指定索引,则默认弹出最后一个.如果列表为空则报IndexError |
remove(value) | 从列表里去掉查到到的第一个value,如果找不到value,会报ValueError.如果成功去除,返回None.Python删除列表内的元素还可以用del li[index]或者del 切片的方法 |
reverse() | 就地倒转列表顺序,直接修改原列表 |
sort(key=None, reverse=False) | 就地排序,直接修改原列表,key可以用一个函数或者lambda表达式来做判断,reverse默认是升序,如果是True则降序.内置函数有一个sorted()函数也可以用来排序,但是sorted函数不会修改原列表 |
直接赋值 浅拷贝 深拷贝
直接赋值:其实就是对象的引用(别名)。
浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
深拷贝(deepcopy):如果需要深拷贝,导入copy模块的deepcopy方法,完全拷贝了父对象及其子对象。
元组
元组的类是tuple,元组一般用来传递一组固定结构的数据,可以方便的拆解到变量里使用.
元组其实是对列表的二次加工,主要的区别就是元素不可被修改,也不能增加或者删除元素.
用tuple()来生成元组,tuple(iterable)将迭代器的内容拿到一个元组里.
注意,写元组的时候,一般要在最后一个元组后边加一个逗号,就可以很清楚的看到是元组.这是惯例.
元组支持索引和切片,切片得到的结果还是一个元组.元组也是一个可迭代对象.
字符串和列表,元组都可以转换.元组也支持.join方法.
元组的一级元素不能够被修改,但是一级元素如果是引用,则可以修改元素的内容.就类似于元组是一排玻璃杯,这些玻璃杯不能更换,但是玻璃杯里装多少水,是可以修改的.
count(self, value) | count方法,返回次数 |
---|---|
index(value, start=None, stop=None) | 查找值返回索引整型,如果没有会报ValueError |
字典
字典就是python语言的哈希表,拥有键值对,键key必须是一个可以hash的值,所以列表不能够作为key,字典也不能够作为key,因为这二者都会产生变化.值则没有限制,可以是任何对象.
字典支持for 循环,但是默认是循环key,in 方法的默认也是判断key.字典是无序的,字典值的索引就是键.
字典的方法:
clear() | 返回None,清除整个字典 |
---|---|
copy() | 复制字典,注意这个也是浅复制 |
fromkeys(*args, **kwargs) | 这个因为有@staticmethod,这是一个静态方法,也就是通过类名调用的方法,这个方法的内容是用给定的克迭代对象和对应的值来产生一个字典,在下边有示例 |
get(k, d=None) | 字典可以直接用key来获得值,但是如果key不存在的话会报错.这时候可以用get方法来取得k对应的值,如果键中没有k,则会返回d,d默认是None,可以自行指定.get函数通常用在结合键值是否在字典内和需要返回一个特殊东西时候的场合 |
items() | 返回这个字典里所有的键值对,类似一个集合.很python的写法就是用两个变量来同时接收键和值 |
keys() | 返回字典里的所有的key构成的一个类似集合的对象,对迭代器的操作都可以用在返回对象上 |
pop(k, d=None) | 按照键k对应的值从字典里弹出.如果找不到k,则返回d,如果d没有指定,则返回KeyError |
popitem() | 从字典里弹出一个键值对,无法控制先弹哪一个,返回的是一个键值对构成的元组.如果字典已经为空,则返回KeyError错误 |
setdefault(k, d=None) | 将字典里k的值设置为d.但是如果k已经存在,则不做任何修改.两种情况都返回k对应的值. |
update(E=None, **F) | 更新列表,返回None.更新的机制是可以用k=v来当参数,也可以传一个字典,如果键已经存在,则更新值,否则将键值对更新到字典内. |
values() | 返回字典里所有值构成的一个类似于元组的东西.可以使用迭代器操作. |
用静态方法生成字典
# 用dict类的静态方法生成字典
v = dict.fromkeys([1, 2, 3, 4, 5, ], 'test')
print(v)
# 结果:
# {1: 'test', 2: 'test', 3: 'test', 4: 'test', 5: 'test'}
enumerate的用法
# enumerate(iterable[, start]),前边是一个可迭代对象,后边是指定开始的索引.
# enumerate返回一个生成器,给原来迭代器中的每个对象,返回一个(索引,对象)的元组.
v = dict.fromkeys([1, 2, 3, 4, 5, ], 'test')
for i in enumerate(v.items(), 99):
print(type(i), i)
# 结果:
# (99, (1, 'test'))
# (100, (2, 'test'))
# (101, (3, 'test'))
# (102, (4, 'test'))
# (103, (5, 'test'))
练习
# 有一个列表 nums = [2,7,11,15,1,8,7],找到列表中任意两个元素相加等于9的元素集合,如[(0,1),(4,5)]
nums = [2, 7, 11, 15, 1, 8, 7]
idx = 0
ls = []
for i in nums:
if idx + 1 == len(nums):
break
else:
for j in range(idx + 1, len(nums)):
if i + nums[j] == 9:
ls.append((i, nums[j]))
idx += 1
print(ls)
*集合:
由不同的元素组成,即集合内不能有重复的元素.集合内的元素是无序排列,而且是可哈希的值,也就是不可变类型.这些元素也可以作为字典的key.
集合的定义,用大括号{}
直接定义集合用大括号 set_a = {1,2,3,4,5} 集合在生成的过程中会自动去除重复元素.集合无序所以也不支持索引.
还可以采用set函数生成集合,如果是列表或者元组,会将其中每个元素拆开,如果是字符串,会将每个字符拆开.
set函数如果对字典使用,只会生成包含键的集合,对列表使用,则列表的元素不能有不可哈希的元素.
集合的内置方法:
add(item) | 向集合内增加一个元素,add只接受一个参数 |
---|---|
clear() | 清空集合 |
copy() | 这个也是浅复制 |
pop() | 弹出集合中的一个元素,如果集合为空,返回KeyError.这个是随机删除. |
remove(item) | 指定删除,参数必须是集合内的元素,如果不存在,返回KeyError |
discard(item) | 指定删除,参数必须是集合内的元素,如果不存在,不做任何事情,也不报错.返回None |
集合的逻辑关系运算
上边的是单体集合操作的方法,集合主要的用途是进行逻辑判断:
集合的逻辑运算符有:
- in
- not in
- ==
- !=
- <,<=
- >,>=
- |,|= 合集
- &,&= 交集
- -,-= 差集
- ,=交叉补集
上边的这些运算,集合也都有方法,详细如下:
intersection(anotherset) | 求自身和另外一个集合anotherset的交集,符号是& |
---|---|
union(anotherset) | 求自身和另外一个集合的并集,符号是| |
difference(anotherset) | 求差集,存在于原集合但不存在参数集合的结果.注意差集交换集合的顺序,结果是不同的.符号是- |
symmetric_difference(anotherset) | 交叉补集,首先把两者合并到一起,然后减去两者共有的部分,相当于并集-交集.符号是^ |
difference_update(anotherset) | 把属于anotherset里的元素直接从当前集合中去掉.这些带有update的方法都是直接更新调用方法的集合.那些不带update的方法,如果要接受更改之后的集合,需要用另外一个参数去接收,或者用|=这种符号. |
intersection_update(anotherset) | 取交集,然后赋给调用方法的变量,即操作完毕之后,原集合变为交集. |
isdisjoint(s) | 如果两个集合没有交集,返回True,否则返回False |
issubset(s) | 如果s包含当前集合,则返回True,否则返回False.就是看当前集合是否是s的子集,相当于<= |
issuperset(s) | 如果s是当前集合的子集,返回True,否则返回False.相当于>= |
symmetric_difference_update(s) | update系列方法 |
update(s) | 单独的update方法就是用并集更新调用方法的集合.没有union_update方法.另外update可以传可迭代对象,可以将可迭代对象拆解后更新多个值进当前集合.而add只能添加一个值,给add传可迭代对象,会将可迭代对象作为单个元素传进去. |
集合关系运算例子
# 集合的关系运算
a = {1, 2, 3, 4, 5, 'a', 'b', 'c'}
b = {3, 4, 5, 'b', 'c', 'd', 'e'}
c = {'f','z',32,421}
d = {'f'}
print(a.intersection(b))
print(a | b)
print(a.union(b))
print(a-b)
print(a.difference(b))
print(b-a)
print(b.difference(a))
print(a^b)
print(a.symmetric_difference(b))
集合还可以用frozenset()定义不可变集合.这个集合不可修改,除了没有增删改的方法之外,其他方法和关系运算与普通列表一致.IDE里也可以通过ctrl查看frozenset类.