列表及方法

列表是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)