字典 dict
字典 是无序的 键:值(key:value)对集合,键必须是互不相同的(在同一个字典之内)。
序列是以连续的整数为索引,与此不同的是,字典以"关键字"为索引,关键字可以是任意不可变类型,通常用字符串或数值。
字典是 Python 唯一的一个 映射类型,字符串、元组、列表属于序列类型。
使用 hash(X),只要不报错,证明 X 可被哈希,即不可变,反过来不可被哈希,即可变。
a = 1
hash(1),hash('1'),hash(a),hash([1,2,3])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-8-f46c3c07a214> in <module>
1 a = 1
----> 2 hash(1),hash('1'),hash(a),hash([1,2,3])
TypeError: unhashable type: 'list'
字典创建和访问
使用dict和{}
a = {'a':1,'b':2}
a_1 = dict([('a',1),('b',2)])
x ,y= ['a','b'],[1,2]
a_2 = dict((x,y))
a,a_1,a_2
({'a': 1, 'b': 2}, {'a': 1, 'b': 2}, {'a': 'b', 1: 2})
a['a']
1
字典方法
dict.fromkeys(seq[, value]) 用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值。
x = ['xiao','da','big']
a = dict.fromkeys(x,10)
a_1 = dict.fromkeys(x)
a_2 = dict.fromkeys(x,[1,2,3])
a_3 = dict.fromkeys(x,(1,2,3))
a,a_1,a_2,a_3
({'xiao': 10, 'da': 10, 'big': 10},
{'xiao': None, 'da': None, 'big': None},
{'xiao': [1, 2, 3], 'da': [1, 2, 3], 'big': [1, 2, 3]},
{'xiao': (1, 2, 3), 'da': (1, 2, 3), 'big': (1, 2, 3)})
dict.keys()返回一个可迭代对象,可以使用 list() 来转换为列表,列表为字典中的所有键。
dict.values()返回一个迭代器,可以使用 list() 来转换为列表,列表为字典中的所有值。
类似index和values
dict.items()以列表返回可遍历的 (键, 值) 元组数组,直接迭代字典只会迭代key。
print(a_1.keys(),a_1.values())
dict_keys(['xiao', 'da', 'big']) dict_values([None, None, None])
[ i for i in a],[i for i in a.items()]
(['xiao', 'da', 'big'], [('xiao', 10), ('da', 10), ('big', 10)])
key in dict in 操作符用于判断键是否存在于字典中,如果键在字典 dict 里返回true,否则返回false。而not in操作符刚好相反,只能判断key
'xiao' in a,'small' in a
(True, False)
dict.pop(key[,default])删除字典给定键 key 所对应的值,返回值为被删除的值。key 值必须给出。若key不存在,则返回 default 值。
del dict[key] 删除字典给定键 key 所对应的值。
类似list
dict.popitem()随机返回并删除字典中的一对键和值,如果字典已经为空,却调用了此方法,就报出KeyError异常。
dict.clear()用于删除字典内所有元素。
a = dict.fromkeys(x,10)
a.pop('big'),a,a.pop('11',20)
(10, {'xiao': 10, 'da': 10}, 20)
a = dict.fromkeys(x,10)
del a['da']
a
{'xiao': 10, 'big': 10}
a = dict.fromkeys(x,10)
a.popitem()
a
{'xiao': 10, 'da': 10}
a = dict.fromkeys(x,10)
a.clear()
a
{}
dict.update(dict2)把字典参数 dict2 的 key:value对 更新到字典 dict 里。
1,2都有的进行替代,1有2无保留
dic = {'Name': 'Lsgogroup', 'Age': 7}
dic2 = {'Sex': 'female', 'Age': 8}
dic.update(dic2)
print(dic)
{'Name': 'Lsgogroup', 'Age': 8, 'Sex': 'female'}
train
字典的长度是多少
请修改'java' 这个key对应的value值为98
删除 c 这个key
增加一个key-value对,key值为 php, value是90
获取所有的key值,存储在列表里
获取所有的value值,存储在列表里
判断 javascript 是否在字典中
获得字典里所有value 的和
获取字典里最大的value
获取字典里最小的value
字典 dic1 = {'php': 97}, 将dic1的数据更新到dic中
dic = {
'python': 95,
'java': 99,
'c': 100
}
print(len(dic))
dic['java'] = 98; dic
del dic['c']; dic
3
{'python': 95, 'java': 98}
dic.keys()
dict_keys(['python', 'java'])
dic1 = {'php': 97}
dic.update(dic1)
dic
{'python': 95, 'java': 98, 'php': 97}
各门课程的考试成绩存储方式并不相同,有的用字典,有的用列表,但是分数都是字符串类型,请实现函数transfer_score(score_dict),将分数修改成int类型
data = {
'python': {'上学期': '90', '下学期': '95'},
'c++': ['95', '96', '97'],
'java': [{'月考':'90', '期中考试': '94', '期末考试': '98'}]
}
data.values()
dict_values([{'上学期': '90', '下学期': '95'}, ['95', '96', '97'], [{'月考': '90', '期中考试': '94', '期末考试': '98'}]])
[ type(i) for i in data.values()]
[dict, list, list]
集合
Python 中set与dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
集合创建
a = {}
b = {1,2,3}
type(a),type(b)
(dict, set)
# 集合可以去重
a = set('hello world')
a
{' ', 'd', 'e', 'h', 'l', 'o', 'r', 'w'}
结合方法
set.add(elmnt)用于给集合添加元素,如果添加的元素在集合中已存在,则不执行任何操作。
a = set('hello world')
a.add('N'); a
{' ', 'N', 'd', 'e', 'h', 'l', 'o', 'r', 'w'}
set.update(set)用于修改当前集合,可以添加新的元素或集合到当前集合中,如果添加的元素在集合中已存在,则该元素只会出现一次,重复的会忽略。
a = set('hello')
b = set('world')
a.update(b)
a
{'d', 'e', 'h', 'l', 'o', 'r', 'w'}
set.remove(item) 用于移除集合中的指定元素。如果元素不存在,则会发生错误
set.discard(value) 用于移除指定的集合元素。remove() 方法在移除一个不存在的元素时会发生错误,而 discard() 方法不会。
a.remove('d')
a
{'e', 'h', 'l', 'o', 'r', 'w'}
a.discard('e')
a
{'h', 'l', 'o', 'r', 'w'}
set1 & set2 返回两个集合的交集。
set1 | set2 返回两个集合的并集。
set1 - set2 返回集合的差集
set1 ^ set2 返回集合的异或
set1 <= set2 判断集合是不是被其他集合包含,如果是则返回 True,否则返回 False。
a = set('hello')
b = set('world')
a&b,a|b,a-b,b-a,a^b
({'l', 'o'},
{'d', 'e', 'h', 'l', 'o', 'r', 'w'},
{'e', 'h'},
{'d', 'r', 'w'},
{'d', 'e', 'h', 'r', 'w'})
(a-b) <=a,(a-b) <=b
(True, False)
train
怎么表示只包含⼀个数字1的元组。
a = (1,)
a,type(a)
((1,), tuple)
创建一个空集合,增加 {‘x’,‘y’,‘z’} 三个元素。
a = set()
a.add('x'),a.add('y')
a
{'x', 'y'}
列表[‘A’, ‘B’, ‘A’, ‘B’]去重。
a = set(['A', 'B', 'A', 'B'])
b = list(a)
b
['A', 'B']
求两个集合{6, 7, 8},{7, 8, 9}中不重复的元素(差集指的是两个集合交集外的部分)。
a,b = {6, 7, 8},{7, 8, 9}
a^b
{6, 9}
求{‘A’, ‘B’, ‘C’}中元素在 {‘B’, ‘C’, ‘D’}中出现的次数。
a = {'A', 'B', 'C'}
b = {'B', 'C', 'D'}
[1 if i in b else 0 for i in a]
[0, 1, 1]
序列
在 Python 中,序列类型包括字符串、列表、元组、集合和字典,这些序列支持一些通用的操作,但比较特殊的是,集合和字典不支持索引、切片、相加和相乘操作。
str([1,2,3])
'[1, 2, 3]'
a = [1,2,3]
sorted?
a = list('hello')
b = list('world')
c = list('happy')
d = list('happiness')
list(zip(a,b,c))
[('h', 'w', 'h'),
('e', 'o', 'a'),
('l', 'r', 'p'),
('l', 'l', 'p'),
('o', 'd', 'y')]
总结
类型 | 字符串 | 列表 | 元组 | 集合 | 字典 |
---|---|---|---|---|---|
是否可以修改 | 不能 | 能 | 不能 | 能 | 能 |
修改命令 | 无 | append、extend、insert | 无 | add | .dict[key]=value |
是否有序 | 有序 | 有序 | 有序 | 有序 | 无序 |
能否重复 | 能 | 能 | 能 | key不能 | 不能 |
生成 | str,’’ | list,[] | tuple,(),不使用()也可 | set,{1,2,3} | {key:value},dict |