字典dict
- 字典是一个非线性结构,是key-value组成的键值对的数据集合。
- 字典的特点:可变的、无序的、key不重复。
字典的定义
- 【{}或者dict()】可以定义一个空字典
- 例如:
a = dict()
b = {}
print(a,b,type(a),type(b))
- 【dict(**kwargs)】可以使用name=value键值对,初始化一个字典
- 例如:
c = dict(gdy="abc",x=90,y=100)
print(c,type(c))
- 【dict(iterable,**kwarg)】使用可迭代对象和name = value度构造字典、不过可迭代对象的元素必须是一个二元结构
- 例如:
d = dict((("a","001"),("b","002")))
print(d,type(d))
- 【dict(mapping,**kwarg)】使用一个字典构建另一个字典
- 例如:
e = {"a":10,"b":20,"c":30}
f = dict(e,abc="20")
print(e,f)
- 【{}】直接定义:例如:e = {“a”:10,“b”:20,“c”:30}
- fromkeys(iterable,value) 【类方法】 #根据建集合初始化一个字典
- iterable :为可迭代的键值集合
- value:为默认所有建对应的默认值。(可以不写,如果没有默认为None)
- 例如:
a = dict.fromkeys(range(10),0)
b = dict.fromkeys(range(10))
print(a)
print(b)
字典元素的访问
- 【d[key]】 返回可用对应的值value,如果可以不存在会抛出keyError异常
- 【get(key[,default])】 返回key对应的值value,如果key不存在就返回缺省值default,缺失值默认为None
- 【setdefault(key[,default])】返回key对应的值value,如果key不存在,添加kv对,value设置为default,并返回default,如果default没有设置,则返回None
- 【keys()】获取字典中所有key的集合
- 【values()】或者字典中所有值values的集合
- 【items()】获取字典中所有键值对组成的集合
字典增加和修改
- 【d[key] = value】将key对象的值修改为value,如果key不存在就添加新的key对应value
- 【update([other])—>None】 使用一个字典里面的数据对本字典的更新,如果key不存在就添加,key存在就覆盖已经存在的key对应的值。 就地修改,无返回值
- 例如:
a = {"1":10,"2":100,"3":200,"b":10,"c":20}
print(a)
a.update(b=100) #更新键值为b的值为100
print(a)
a.update([("1","ab")]) #将键值"1"的值修改为"ab"
print(a)
c = a.setdefault(1,5) #获取键值为1对应的value的值,如果没有就插入键值对1,5 ,并返回默认值
c2 = a.setdefault(1,6) #获取键值为1对应的value的值,如果没有就插入键值对1,6,滨返回默认值
print(a,c,c2)
a.update([(1,2)]) #将键值对key=1的值修改为2,如果没有找到键值为1,就添加键值对1,2
print(a)
a.update([(1,5)]) #将键值为1对应的值修改为5
print(a)
字典的删除
- 【pop(key[,default])】 将key对应的值删除,并返回key对应的值。如果key不存在就返回缺省值defalut。如果未设置default,并且key不存在会抛出异常keyError
- 【popitem()】移除并返回任意的键值对,字典为empty空时会抛出异常KeyError
- 【clear()】清空字典
- 【del d[key]】 删除指定key的键值对
- 相关参数 del语句
- 例如【del a[‘c’]】看着像删除了一个对象,本质上减少了一个对象的引用,del实际上删除的是名称,而不是对象。
a = True
b = [1,2]
c = [b,3]
print(a,b,c)
del a #将变量a的名称删除
#print(a) #会报错,因为变量a已经不存在
del b #将变量b的名称删除
print(c)
字典的遍历
- list(d.keys()) 根据字典的建集合或对应的list集合
注意:【for i in a.keys() 】等价于【for i in a】或者直接使用如下方法直接遍历出元素和元组
【for i,k in a.items()】
- 例如:
a = dict(a=1,b=2,c=3,d=4,e=5)
print(a.keys())
b = list(a.keys())
print(b)
for i in a.keys(): print(i) #打印所有key的值
print("-----------------")
for k in a : print(k)
总结
- python3中 keys、values、items方法返回一个类似生成器的可迭代对象,不会吧函数的返回结果复制到内存中,返回的对象可以使用len()、iter()、in操作
- 返回Dictionary view对象,可以使用len()、iter()、in操作
- 字典的entry的动态视图,字典变化,视图将反映出这些变化
- keys返回一个类set对象,也就是可以看做一个set集合
- 如果values都可以hash,那么items也可以看做是类set对象
- python2中上述方法返回的是一个新列表,占用新的内存空间。所以Python2建议使用iterkeys、itervalues、iteritems版本,返回一个迭代器,而不是返回一个copy
相关字典
缺省字典(defaultdict)
- 需要导入模块import collections
- 定义方式:
import collections
defdict = collections.defaultdict(dict) #建立一个缺省值为dict的缺省字典。
deflist = collections.defaultdict(list) #建立一个缺省值为list的缺省字典。
defset = collections.defaultdict(set) #建立一个缺省值为set的缺省字典。
defdict["c"] = 1
defdict.update([("a","b")])
deflist["a"] = 1
defset["b"] = 1
for i in range(5):
deflist[i].append(i) #当key=i的键对应的值不存在是,默认创建一个key对应的list集合。并在集合中添加i元素
defset[i].update([(i,i)]) #当key=i的键对应的值不存在是,默认创建一个key对应的set集合。并在集合中添加i元素
defdict[i].update([(i,i)]) #当key=i的键对应的值不存在是,默认创建一个key对应的dict集合。并在集合中添加i元素
print(defdict,deflist,defset,sep="\n")
有序字典(OrderedDict)
- 和defaultdict一样,需要导入模块import collection
- 定义方式和defaultdict类似。但不同的是OrderedDict是有序字典,里面元素的排列顺序是元素的插入顺序。
- 注意:3.6版本中的Python的字典就是记录key插入的顺序(IPython不一定有效)
- 简单示例
import collections
order = collections.OrderedDict() #实例化一个有序字典
order.update([(4,10)]) # 插入键值对4,10
for i in range(5): #给字典插入新元素
order[i] = i
order.setdefault(6,10) #给字典插入新元素
print(order.keys())
print(order.values())
print(order)
- 有序字典排序
- sorted(iterable, /, *, key=None, reverse=False) 函数会返回一个新的字典对象
- 例如:
import random,string
word = { _:2 for _ in [random.choice(string.ascii_lowercase) for _ in range(20)]} #随机生成20个字母组成的字典
print(word)
wordsort = sorted(word.items()) #使用sorted将字典,按照key排序。
print(wordsort)
字典与list结合使用:
- 可以使用字典记录元素。在加个列表list记录存在字典中元素的实际位置,用列表的顺序记录在字典中对应元素的大小。这样在使用list遍历时,可以保证在列表中元素的顺序。而再查找元素时使用字典查找,保证了检索的速度,避免了list的缺点。