Python--字典

一,字典的定义:

     字典是key-value键值对的集合,是可变的,无序的,key唯一的

二,字典的初始化:

    (1)定义空字典:d=dict() 或者 d={}

    (2)dict(**kwarg)使用name=value对初始化一个字典

            例:

d=dict(a=1,b=2,c=2) #其中的a,b,c需要为标识符,可以被赋值,而int和str可以被赋值吗?不可以的

    (3)dict(iterable,**kwarg)使用可迭代对象和name=value对构造字典,不过可迭代对象的元素必须是一个二元结构.

        例:

d=dict(((1,'c'),(2,'f')))
d=dict(([3,'x'],[4,'y']))

    (4)dict(mapping,**kwarg)使用一个字典构建另一个字典

    (5)d={'a':10,'b':20,'c':None,'d':[1,2,3]}

    (6)类方法dict.fromkeys(iterable,value)

            d=dict.fromkeys(range(5))

            d=dict.fromkets(range(5),0)

三.字典元素的访问

    (1)d[key] 返回对应的value值,key若不存在则抛出keyerror异常

    (2)get(key[,default]) 返回key对应的value值,若key不存在则返回缺省值,未设置缺省值返回None

    (3)setdefault(key[,default]) 返回key对应的value值,若key不存在添加kv对,value为default,并返回default,若default没有设置则缺省值为None.

四.字典元素的修改

    (1)d[key]=value 将key对应的值修改为value,若key不存在则添加新的kv对

    (2)update[other] -> None

        使用另一个字典的kv对更新本字典,若key不存在就添加;若key存在则覆盖已经存在的key对应的值;是就地修改.

        例:

d={}
d.update(red=1)
d.update((('red',2),))
d.update({'red':3})

五.字典的删除

    (1)pop(key[,deffault]) 若key存在则移除它并返回它的value,key不存在返回给定的default,若default未设置且key不存在则抛出KeyError异常.

    (2)popitem()  移除并返回一个任意的键值对,字典为empty抛出KeyError异常

    (3)clear()  清空字典

    (4)del语句  

         举例说明:

b=[6]
d={'a':3,'b':b,'c':100}
id(b),id(d['b'])
del b
print(b)
print(d['b'])

         我们得出结论,del b 看起来像是删除了一个对象,但本质上是减少了一个对象的引用,del实际上删除的是名称,而不是对象.

六.字典的遍历

    for ... in dict:

    (1)遍历key

        for k in d:

            print(k)

        for k in d.keys():

            print(k)  

    (2)遍历value

        for k in d:

            print(d[k])

        for k in d.keys():

            print(d.get(k))  #k在keys()中,得到k就是得到key

        for v in d.values():

            print(v)

     (3)遍历items,即kv对

         for item in d.items():

             print(item)

         for item in d.items():

             print(item[0],item[1])  #item[0]为key,item[1]为value

         for k,v in d.items():

             print(k,v)

         for k,_ in d.items():

             print(k)

         for _,v in d.items():

             print(v)

       总结:

            Python3中,keys,values,items方法返回一个类似生成器的可迭代对象,不会把函数的返回结果复制到内存中.   1)Dictionary view 对象      2)字典的entry的动态视图,字典变化,视图,将反映出这些变化

       Python2中,上面的方法会返回一个新的列表,占据新的内存空间.所以Python2中建议使用iterkeys,itervalues,iteritems版本,返回一个迭代器而不是一个copy.

七.字典遍历和移除

    如何在遍历的过程中移除元素?

    错误解法:

d=dict(a=1,b=2,c='abc')
for k,v in d.items():
    d.pop(k)

    正确解法:

d=dict(a=1,b=2,c='abc')
keys=[]
for k,v in d.items():
    if isintance(v,str):
        keys.append(k)
for k in keys:
    d.pop(k)
print(d)

八.字典的key

    key的要求和set一样:

        set的元素可以看作key,set可以看作简化版的dict.

        hashable  可哈希才可以作为key,可使用hash()测试

        d={1:0,2.0:3,"abc":None,("hello","world","python"):"string",b'abc':'135'}

九.defaultdict

    collections.defaultdict([default_factory[,...]])

       第一个参数是default_factory,缺省值是None,它提供一个初始化函数.当key不存在时,会调用这个工厂函数来生成key对应的value.

例:

这是不利用defaultdict的所作所为

import random
d1={}
for k in 'abcdef':
    for i in range(random.randint(1,5)):
        if k not in d.keys():
            d1[k]=[]
        d1[k].append(i)
print(d1)

这是用了defaultdict的所作所为

from collections import defaultdict
import random
d1=defaultdict(list)
for k in 'abcdef':
    for i in range(random.randint(1,5)):
        d1[k].append(i)
print(d1)

十.collections.OrderedDict([items])

        key并不是按照加入的顺序排列,可以使用OrderedDict记录顺序.

例:

from collections import OrderedDict
import random
d={'banana':3,'apple':4,'pears':1,'orange':1}
print(d)
keys=list(d.keys())
random.shuffle(keys)
print(keys)
od=OrderedDict()
for key in keys:
    od[key]=d[key]
print(od)
print(od.keys())

    (1)有序字典可以记录元素插入顺序,打印时也按照这个顺序输出打印

    (2)3.6版本的Python的字典就是记录key插入的顺序(IPython中不一定有效果)

    (3)应用场景: 假如使用字典记录了N个产品,这些产品使用ID由小到大加入到字典中;

                        除了使用字典检索的遍历,有事需要取出ID,但是希望是按照输入的顺序,因为输入是有序的;

                        否则还需要重新把遍历的值排序.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值