2.8. s.update( "字符串" ) 与 s.update( {"字符串"} ) 的区别 11
字典是另一种可变容器模型,且可存储任意类型对象.
字典的每个键值(key,value)对用冒号(:)分隔,每个对之间用逗号(,)分隔,整个字典包括在花括号({})中,格式如下:
d={key1:value1,key2:value2}
键必须是唯一的,但值则不必.
值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组.
吧相应的键放入到方括号中
dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
print ("dict['Name']: ", dict['Name'])
print ("dict['Age']: ", dict['Age'])
dict['Name']: Runoob
dict['Age']: 7
向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对
dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
dict['Age'] = 8; # 更新 Age
dict['School'] = "菜鸟教程" # 添加信息
print ("dict['Age']: ", dict['Age'])
print ("dict['School']: ", dict['School'])
dict['Age']: 8
dict['School']: 菜鸟教程
能删单一的元素也能清空字典,清空只需一项操作.
显示删除一个字典用del命令.
dict1 = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
del dict1['Name'] # 删除键 'Name'
dict1.clear() # 清空字典
del dict 1 # 删除字典
print ("dict1['Age']: ", dict1['Age'])
print ("dic1t['School']: ", dict1['School'])
但这回引发一个异常,因为最后一个del操作后,字典不存在
Traceback (most recent call last):
File "test.py", line 9, in <module>
print ("dict['Age']: ", dict['Age'])
TypeError: 'type' object is not subscriptable
字典值可以是任何的python对象,既可以是标准的对象,也可以使用户定义的,但键不行.
注意:
1.不允许同一个键出现两次.创建时如果同一个键被赋值两次,后一个值会被记住,即前一个该键的值会被代替.
2.键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行.
dict = {['Name']: 'Runoob', 'Age': 7}
print ("dict['Name']: ", dict['Name'])
以上实例输出结果:
Traceback (most recent call last):
File "test.py", line 3, in <module>
dict = {['Name']: 'Runoob', 'Age': 7}
TypeError: unhashable type: 'list'
字典内置函数len(dict):计算字典元素个数,即键的总数.
str(dict):输出字典,以可打印的字符串表示.
type(varible):返回输入的变量类型,如果变量是字典就返回字典类型,可以用来判断数据类型,type通用,后会细讲.
字典内置方法clear():删除字典内所有元素.
copy():返回一个字典的浅赋值.
fromkeys(seq):创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值.一般seq都是一个列表、元组,如果seq我们写成字典,则会把字典里的键取出来用作新字典的键.并且新建的字典不是原来的字典.
get(key,default=None):返回指定键的值,如果值不存在字典中返回default值.
key in dict:如果键在字典dict里返回true,否则返回false
items():以列表返回可遍历的(键,值)元组数组.
keys():返回一个迭代器,可以使用list()来转化为列表
setdefault(key,default=None):和get()类似,但如果键不存在于字典中,将会添加键并将至设为default.
update(dict2):把字典dict2的键/值对更新到dict里
values():返回一个迭代器,可以使用list()来转化为列表
pop(key[,default]):删除字典给定键key所对应的值,返回值为被删除的值.key值必须给出,否则,返回default值.
popitem():随机返回并删除字典中的一对键和值(一般删除末尾对).
字典可以通过以下方法调换 key和 value,当然要注意原始 value 的类型,必须是不可变类型:
dic = {
'a': 1,
'b': 2,
'c': 3,
}
reverse = {v: k for k, v in dic.items()}
原理是通过zip把字典的键值对压缩成一个迭代器,然后使用max获取迭代器中最大的值.
print(dic)
print(reverse)
输出如下:
{'a': 1, 'b': 2, 'c': 3}
{1: 'a', 2: 'b', 3: 'c'}
获取字典中最大的值及其键:
prices = {
'A':123,
'B':450.1,
'C':12,
'E':444,
}
max_prices = max(zip(prices.values(), prices.keys()))
print(max_prices) # (450.1, 'B')
Python3.x 中会碰到这样的问题:
>>> sites_link = {'runoog':'runoob.com', 'google':'google.com'}
>>> sides = sites_link.keys()
>>> print(sides[0])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'dict_keys' object does not support indexing
>>>
原因说明及解决方法:
dict.values()
dict.keys()
在 python2.x dict.keys 返回一个列表,但是在在 Python 3.x 下,dict.keys 返回的是 dict_keys 对象,若需要转换为列表,请使用:
list(dict.values())
list(dict.keys())
修改上面实例:
>>> sites_link = {'runoog':'runoob.com', 'google':'google.com'}
>>> sides = sites_link.keys()
>>> list(sides)
['runoog', 'google']
>>>
>>>a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'r', 'd'}
集合是一个无序不重复元素的序列.
可以使用大括号{}或者set()函数创建集合,注意:创建一个空集合必须用set()而不是{},因为{}是用来创建一个字典.
>>>basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket) # 这里演示的是去重功能
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket # 快速判断元素是否在集合内
True
>>> 'crabgrass' in basket
False
>>> # 下面展示两个集合间的运算.
...
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a
{'a', 'r', 'b', 'c', 'd'}
>>> a - b # 集合a中包含元素
{'r', 'd', 'b'}
>>> a | b # 集合a或b中包含的所有元素
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b # 集合a和b中都包含了的元素
{'a', 'c'}
>>> a ^ b # 不同时包含于a和b的元素
{'r', 'd', 'b', 'm', 'z', 'l'}
语法格式如下:
s.add( x )
将元素 x 添加到集合 s 中,如果元素已存在,则不进行任何操作。
实例(Python 3.0+)
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.add("Facebook")
>>> print(thisset)
{'Taobao', 'Facebook', 'Google', 'Runoob'}
还有一个方法,也可以添加元素,且参数可以是列表,元组,字典等,语法格式如下:
s.update( x )
x 可以有多个,用逗号分开。
实例(Python 3.0+)
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.update({1,3})
>>> print(thisset)
{1, 3, 'Google', 'Taobao', 'Runoob'}
>>> thisset.update([1,4],[5,6])
>>> print(thisset)
{1, 3, 4, 5, 6, 'Google', 'Taobao', 'Runoob'}
>>>
语法格式如下:
s.remove( x )
将元素 x 添加到集合 s 中移除,如果元素不存在,则会发生错误。
实例(Python 3.0+)
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.remove("Taobao")
>>> print(thisset)
{'Google', 'Runoob'}
>>> thisset.remove("Facebook") # 不存在会发生错误
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Facebook'
>>>
此外还有一个方法也是移除集合中的元素,且如果元素不存在,不会发生错误。格式如下所示:
s.discard( x )
实例(Python 3.0+)
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.discard("Facebook") # 不存在不会发生错误
>>> print(thisset)
{'Taobao', 'Google', 'Runoob'}
我们也可以设置随机删除集合中的一个元素,语法格式如下:
s.pop()
实例(Python 3.0+)
>>>thisset = set(("Google", "Runoob", "Taobao", "Facebook"))
>>> thisset.pop()
'Taobao'
>>> print(thisset)
{'Facebook', 'Google', 'Runoob'}
语法格式如下:
len(s)
计算集合 s 元素个数。
实例(Python 3.0+)
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> len(thisset)
3
语法格式如下:
s.clear()
清空集合 s。
实例(Python 3.0+)
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.clear()
>>> print(thisset)
set()
语法格式如下:
x in s
判断元素 s 是否在集合 x 中存在,存在返回 True,不存在返回 False。
实例(Python 3.0+)
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> "Runoob" in thisset
True
>>> "Facebook" in thisset
False
>>>
s.update( "字符串" ) 与 s.update( {"字符串"} ) 含义不同:
s.update( {"字符串"} ) 将字符串添加到集合中,有重复的会忽略。
s.update( "字符串" ) 将字符串拆分单个字符后,然后再一个个添加到集合中,有重复的会忽略。
>>> thisset = set(("Google", "Runoob", "Taobao"))
>>> print(thisset)
{'Google', 'Runoob', 'Taobao'}
>>> thisset.update({"Facebook"})
>>> print(thisset)
{'Google', 'Runoob', 'Taobao', 'Facebook'}
>>> thisset.update("Yahoo")
>>> print(thisset)
{'h', 'o', 'Facebook', 'Google', 'Y', 'Runoob', 'Taobao', 'a'}
>>>
集合用 set.pop() 方法删除元素的不一样的感想如下:
1、对于 python 中列表 list、tuple 类型中的元素,转换集合是,会去掉重复的元素如下:
>>> list = [1,1,2,3,4,5,3,1,4,6,5]
>>> set(list)
{1, 2, 3, 4, 5, 6}
>>> tuple = (2,3,5,6,3,5,2,5)
>>> set(tuple)
{2, 3, 5, 6}
2、集合对 list 和 tuple 具有排序(升序),举例如下:
>>> set([9,4,5,2,6,7,1,8])
{1, 2, 4, 5, 6, 7, 8, 9}
>>> set([9,4,5,2,6,7,1,8])
{1, 2, 4, 5, 6, 7, 8, 9}
3、集合的 set.pop() 的不同认为
有人认为 set.pop() 是随机删除集合中的一个元素、我在这里说句非也!对于是字典和字符转换的集合是随机删除元素的。当集合是由列表和元组组成时、set.pop() 是从左边删除元素的如下:
列表实例:
set1 = set([9,4,5,2,6,7,1,8])
print(set1)
print(set1.pop())
print(set1)
输出结果:
{1, 2, 4, 5, 6, 7, 8, 9}
1
{2, 4, 5, 6, 7, 8, 9}
元组实例:
set1 = set((6,3,1,7,2,9,8,0))
print(set1)
print(set1.pop())
print(set1)
输出结果:
{0, 1, 2, 3, 6, 7, 8, 9}
0
{1, 2, 3, 6, 7, 8, 9}
首先把列表和元组转成集合,集合会自动去重,但是因为集合有自动排序的功能,所以这个时候列表和元组的元素
的位置是发生了变化的,即被集合自动排序了.
1、不能保证原来的顺序
l = [1,1,1,1,'egon','alex','egon']
s = set(l)
print(s) # {'egon', 1, 'alex'}
l = list(s)
print(l) # ['egon', 1, 'alex']
2、不能针对可变类型去重
l = [1,1,1,1,'egon','alex','egon',{'a':1}]
s = set(l)
print(s) # 报错
info = [
{'name':'egon', 'age':18},
{'name':'alex', 'age':73},
{'name':'egon', 'age':18},
{'name':'lxx', 'age':19},
]
l = []
for dic in info:
if dic not in l:
l.append(dic)
# l = [
{'name':'egon', 'age':18},
{'name':'alex', 'age':73},
{'name':'lxx', 'age':19},
]