列表与字典是其他对象类型的集合。
一、内置对象---list(列表),可以包含数字、字符串或其他列表。其属性主要有
1.任意对象的有序集合,列表就是收集其他对象的地方,同时是有位置顺序的。
2.通过偏移读取
3.可变长度、异构和任意嵌套
4.属于可变序列的分类
5. 对象引用数组
实际应用中的列表
1.基本列表操作
>>> len([1,2,3]) #列表长度
3
>>> [1,2,3]+[3,4,5] #合并
[1, 2, 3, 3, 4, 5]
>>> [1,2,3]*2 #重复
[1, 2, 3, 1, 2, 3]
>>> str([1,2])+"34" #将列表转换为字符串后合并
'[1, 2]34'
>>> [1,2]+list("34") #将字符串转换列表后合并
[1, 2, '3', '4']
>>>
2.列表迭代和解析(随时盖楼)
>>> s=[]
>>> for c in 'spam':
... s.append(c*4) #在列表末尾添加新值
...
>>> s
['ssss', 'pppp', 'aaaa', 'mmmm']
>>>
3.索引、分片和矩阵
>>> s=['one','two','three']
>>> s[1]
'two'
>>> s[-1]
'three'
>>> s[1:]
['two', 'three']
>>> s=[[1,2,3],[4,5,6],[7,8,9]]
>>> s[1]
[4, 5, 6]
>>> s[1][1]
5
4.原处修改列表
>>> s=['one','two','three']
>>> s[0]="I" #使用索引赋值的方法在原处修改
>>> s
['I', 'two', 'three']
>>> s[1:]=["love",'you'] #通过分片方法在原处修改,分片的理解最好分两步,1删除,删除等号左边指定的分片。2插入,将等号右边的对象的片段插入旧分片的位置。
>>> s
['I', 'love', 'you']
>>>
>>> s[1:2]=[] #先删除咯
>>> s
['I', 'you'] #注 实际上分片赋值时一次性替换整个片段的,因为被赋值的序列长度不一定要与被赋值的分片的长度相匹配,所以可以用来替换,增长,缩短主列表。
5.列表方法
列表对象也支持特定类型方法调用,方法:是属于特性对象的函数(实际上是引用函数的属性),以下方法只使用于列表
>>> s
['I', 'you']
>>> s.append('love') #在列表末尾增加一个单项
>>> s
['I', 'you', 'love']
>>> s.sort() #进行排序,默认是升序(字符串)
>>> s
['I', 'love', 'you']
>>> s.sort(key=str.lower) #可以使用name=value语法配置选项,key参数给了一个参数的函数,它返回在排序中使用的值
>>> s
['I', 'love', 'you']
>>> s.sort(key=str.lower,reverse=True) #而reverse参数允许使用降序而不是升序
>>> s
['you', 'love', 'I']
>>>
注:当使用append和sort原处修改列表对象时,结果并没有返回列表而是NONE,如下
>>> s
['one', 'two', 'three']
>>> s.append("four") #使用此方法即可
>>> s
['one', 'two', 'three', 'four']
>>> s=s.append("five") #这样的修改对象操作 有点副作用,没有理由重新赋值,使用上面的操作即可
>>> s
>>> #这里是none
>>>
>>> s=['one','two','three']
>>> s.extend(['four','five']) #同时在末尾添加多个项
>>> s
['one', 'two', 'three', 'four', 'five']
>>> s.pop() #删除末尾的项并返回已删除的项
'five'
>>> s.reverse() #原处反转
>>> s
['four', 'three', 'two', 'one']
>>> list(reversed(s)) #反转返回新列表,未保存在s中
['one', 'two', 'three', 'four']
>>> s.index('three') #查找three的偏移值
1
>>> s.insert(1,'test') #在偏移1处插入test项
>>> s
['four', 'test', 'three', 'two', 'one']
>>> s.remove('test') #删除一个项
>>> s.pop(1) #删除指定偏移的项
'three'
>>> s
['four', 'two', 'one']
>>>
>>> del s[0] #删除索引为0的项
>>> s
['two', 'one'] #删除分片从偏移0到末尾
>>> del s[0:]
>>> s
[] #空列表
>>>
二、字典:无序的集合,是通过键对字典进行索引操作,不是偏移位置存取。
1.创建方法
>>> {'name':'Lili','age':18} #一次性创建,知道有多少键
{'name': 'Lili', 'age': 18}
>>> s={} #动态的创建每一个键及值
>>> s['name']='Lili'
>>> s['age']=18
>>> s
{'name': 'Lili', 'age': 18}
>>> dict(name='Lili',age=18) #代码少,键必须是字符串
{'name': 'Lili', 'age': 18}
>>> dict([('name','Lili'),('age',18)]) #程序运行时将键和值逐步建立成序列
{'name': 'Lili', 'age': 18}
>>>
>>> dict.fromkeys(['a','b'],0) #通过fromkeys简单的传入所有键列表,以及所有键的初始值
{'a': 0, 'b': 0}
>>>
>>> dict.fromkeys('fuck')
{'f': None, 'u': None, 'c': None, 'k': None}
>>>
>>> list(zip(['a','b','c'],[1,2,3])) #zip函数将对象中对应的元素打包成一个个元组,然后将元组转换为列表
[('a', 1), ('b', 2), ('c', 3)]
>>> s=dict(zip(['a','b','c'],[1,2,3])) #将键和值对应起来传给dict
>>> s
{'a': 1, 'b': 2, 'c': 3}
>>> s={k:v for (k,v)in zip(['a','b','c'],[1,2,3])} #通过字典解析方法创建字典
>>> s
{'a': 1, 'b': 2, 'c': 3}
>>> s={x:x**2 for x in [1,2,3,4]}
>>> s
{1: 1, 2: 4, 3: 9, 4: 16}
>>> s={x:x*4 for x in 'fuck'}
>>> s
{'f': 'ffff', 'u': 'uuuu', 'c': 'cccc', 'k': 'kkkk'}
>>>
2.字典的基本操作
>>> s={'x':3,'y':4,'z':'5'} #用花括号括起来,使用key:value并用逗号隔开的元素
>>> s['x'] #使用key键取值,而不是偏移
3
>>> s
{'x': 3, 'y': 4, 'z': '5'}
>>>
>>> len(s) #计算字典的长度
3
>>> 'x' in s #判断键是否存在于字典
True
>>> list(s.keys()) #用键来创建一个列表
['x', 'y', 'z']
>>>
>>> s['x']=['a','b','c'] #在原处直接修改
>>> s
{'x': ['a', 'b', 'c'], 'y': 4, 'z': '5'}
>>> del s['z'] #del()通过使用key删除一个元素
>>> s
{'x': ['a', 'b', 'c'], 'y': 4}
>>>
>>> dir(s) #字典可用的方法
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
>>> list(s.values()) #通过values方法返回字典中的元素
[['a', 'b', 'c'], 4]
>>> list(s.items()) #通过items方法返回字典中的对元组(key,value)
[('x', ['a', 'b', 'c']), ('y', 4)]
>>>
>>> s.get('z') #使用get()可以判断一个key是否存在并返回其元素
>>>
>>> s.get('x') #使用get()可以判断一个key是否存在并返回其元素并返回其值
['a', 'b', 'c']
>>> print(s.get('z')) #使用get()可以判断一个key是否存在并返回其元素,若不存在返回none
None
>>> s1={'z':5,'a':6}
>>> s.update(s1) #将字典s1合并到s中
>>> s
{'x': ['a', 'b', 'c'], 'y': 4, 'z': 5, 'a': 6}
>>> s.pop() #与列表的pop有所不同,列表中pop()可删除最后一个元素并返回其值。但字典不可
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: pop expected at least 1 arguments, got 0
>>> s.pop('a') #通过pop(键)删除一个元素
6
>>>s
{'x': 1, 'y': 2, 'z': 3}
>>> for i in s: #通过迭代字典中的每一个键,打印他们的键和值。此命令等同于 for i in s.keys().
... print(i,'\t',s[i])
...
x 1
y 2
z 3
>>>
>>> s={1:3,2:2,3:1} #键不一定是字符串。只要是不可变的对象都可以(除列表外)
>>> s
{1: 3, 2: 2, 3: 1}
>>>
3.字典视图
>>> s
{'f': 'ffff', 'u': 'uuuu', 'c': 'cccc', 'k': 'kkkk'}
>>> s.keys()
dict_keys(['f', 'u', 'c', 'k'])
>>> d=s.keys()
>>> d
dict_keys(['f', 'u', 'c', 'k'])
>>> list(d)
['f', 'u', 'c', 'k']
>>> f=s.values()
>>> f
dict_values(['ffff', 'uuuu', 'cccc', 'kkkk'])
>>> list(f)
['ffff', 'uuuu', 'cccc', 'kkkk']
>>> del s['f']
>>> s
{'u': 'uuuu', 'c': 'cccc', 'k': 'kkkk'}
>>> list(d)
['u', 'c', 'k']
>>> list(f)
['uuuu', 'cccc', 'kkkk']
>>>
5.字典键排序
>>> s=dict(zip(['y','a','x'],[1,2,3]))
>>> s
{'y': 1, 'a': 2, 'x': 3}
>>> ks=s.keys()
>>> list(ks)
['y', 'a', 'x']
>>> ks=list(ks)
>>> ks
['y', 'a', 'x']
>>> ks.sort() #sort()
>>> ks
['a', 'x', 'y']
>>> for k in ks:print(k,s[k])
...
a 2
x 3
y 1
>>>
>>>
>>> s=dict(zip(['a','c','b'],[1,2,3]))
>>> s
{'a': 1, 'c': 2, 'b': 3}
>>> ks=s.keys()
>>> ks
dict_keys(['a', 'c', 'b'])
>>> sorted(ks) #sorted()
['a', 'b', 'c']
>>> for k in sorted(ks):print(k,s[k])
...
a 1
b 3
c 2
>>>
6.测试字典键是否存在。使用in或者get方法
>>> s
{'a': 1, 'c': 2, 'b': 3}
>>> 'a' in s
True
>>> print(s.get('a'))
1
>>>