Python基础 —— dict


这里写图片描述

  • 提供 copy 成员函数
  • 内部有__len__,故可通过 len() 获得一个字典的长度;

0. D.get(k[,d]) vs D.setdefault()

D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.

  • d.get(‘monkey’, ‘N/A’):不存在的key,默认返回为 N/A

D.get(k[,d]) 该函数的含义不仅像 D[k] 一样,取出键为 k 时的 value,还在于当 k not in D 时,指定一个默认值,从而避免 KeyError,而使程序中断。

  • (1)使用 setdefault() 指定初值

    def histogram(values, mode=0):
        bins = {}
        for v in values:
            bins.setdefault(v, 0) 
            bins[v] += 1
        if mode:
            return sorted(bins.values(), key=lambda x: (x[1], x[0]), reverse=True)
        return sorted(bins.values())
    
  • (2)使用 get() 指定初值

    def histogram(values, mode=0):
        bins = {}
        for v in values:
            bins[v] = bins.get(v, 0) + 1
        if mode:
            return sorted(bins.values(), key=lambda x: (x[1], x[0]), reverse=True)
        return sorted(bins.values())

1. 多样的构造函数

  • 使用关键字参数:

    >>> dict(initial=5, taps=[-2, -1])
    {'initial': 5, 'taps': [-2, -1]}
  • fromkeys

    >>> seq = ('name', 'age', 'sex')
    >>> d = dict.fromkeys(seq)
    >>> d
    {'age': None, 'name': None, 'sex': None}
    
    >>> seq = ('apple', 'banana', 'orange')
    >>> d = dict.fromkeys(seq, 10.5)
            # 统一指定初值
    >>> d 
     {'apple': 10.5, 'banana': 10.5, 'orange': 10.5}

2. 遍历

>>> d = dict(initial=5, taps=[-2, -1])
>>> for i in d:            # 等价于 for k in d.keys()
        print(i)
>>> for k, v in d.items():
        print(k+':', v)     

3. 索引一个不存在的键,并赋值,即是添加

如果直接索引一个不存在的键,则会报KeyError

>>> t = [('zch', 24), ('lx', 24), ('whb', 25)]
>>> d = {k:v for k,v in t}
>>> d
{'lx': 24, 'whb': 25, 'zch': 24}

>>> d['lxw'] = 25
>>> d 
{'lx': 24, 'lxw': 25, 'whb': 25, 'zch': 24}

4. dict.setdefault():字典元素的初始化

既然是初始化,只执行一次,无论被调用多次。

其实也可替换为 if 判断 + 初始化:

d.setdeault(key, 0)

等价于:

if key not in d:
    d[key] = 0

5. 字典无序

>>> d = {'zhang':23, 'li':23}
>>> d[0]
KeyError: 0

字典无序,所以 d[0],会报 KeyError。
之所以无序,是因为字典里元素的顺序并不重要,这也是为什么字典这一数据结构使用用来表示集合(集合只关心其中的内容,自然与顺序无关)的大括号( {} { } )的原因;

6. 字典的键和值均可为非基本数据类型之外的,比如元组或者list

>>> m = {}
>>> m[(0, 0)] = [1, 1]
                    # 索引一个无的,不会报KeyError,
                    # 而是进行键值pair的添加

一大应用实例在于 从0-1背包问题到动态规划

def fastMaxVal(i, w, v, c, m):
    try:
        return m[(i, c)]
    except KeyError:
        if i == 0:
            if w[i] <= c:
                m[(i, c)] = v[i]
                return v[i]
            m[(i, c)] = 0
            return 0
        without_i = fastMaxVal(i-1, w, v, c, m)
        if w[i] > c:
            m[(i, c)] = without_i
            return m[(i, c)]
        with_i = v[i] + fastMaxVal(i-1, w, v, c-w[i], m)
        m[(i, c)] = max(without_i, with_i)
        return m[(i, c)]

7. 字典的一些典型应用实例

除了上文的以tuple为键(因为要保存二元元组对应的value值)的字典,还有一般的以基本数据类型为类型的键值对,比如在斐波那契的动态规划版中 从0-1背包问题到动态规划

def fib(n, m):
    if n not in m:
        m[n] = fib(n-1, m) + fib(n-2, m)
    return m[n]

我们会看到这两大应用均是为大名鼎鼎的动态规划的memo(lookup table)提供数据结构支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值