如何将字典转换为默认字典python?

时间:2015-07-23 08:16:13

标签: python dictionary

mapfile = {
    1879048192: 0,
    1879048193: 0,
    1879048194: 0,
    1879048195: 0,
    1879048196: 4,
    1879048197: 3,
    1879048198: 2,
    1879048199: 17,
    1879048200: 0,
    1879048201: 1,
    1879048202: 0,
    1879048203: 0,
    1879048204: 4,
    # intentionally missing byte
    1879048206: 2,
    1879048207: 1,
    1879048208: 0 # single byte cannot make up a dword
}

_buf = {}
for x in (x for x in mapfile.keys() if 0==x%4):
    try:
        s = "0x{0:02x}{1:02x}{2:02x}{3:02x}".format(mapfile[x+3],mapfile[x+2],mapfile[x+1],mapfile[x+0])
        print "offset ", x, " value ", s
        _buf[x] = int(s, 16)
    except KeyError as e:
        print "bad key ", e

print "_buf is ", _buf

由于我正在使用字典,我得到的是keyError,Plan是将字典设为defaultdict(int)所以在默认字典中,当出现密钥错误时它将填零。但是我没有找到任何解决方案。如何在谷歌中将字典转换为默认字典?请帮助解决这个问题

4 个答案:

答案 0 :(得分:6)

您可以将字典转换为defaultdict

>>> a = {1:0, 2:1, 3:0}
>>> from collections import defaultdict
>>> defaultdict(int,a)
defaultdict(<type 'int'>, {1: 0, 2: 1, 3: 0})

答案 1 :(得分:3)

您可以使用get(key, default),而不是重新创建字典。 key是您要检索的密钥,如果密钥不在字典中,则default是要返回的值:

my_dict = { }
print my_dict.get('non_existent_key', 0)
>> 0

答案 2 :(得分:2)

我认为,KeyError可以通过将0设置为默认值来解决。

In [5]: mydict = {1:4}

In [6]: mydict.get(1, 0)
Out[6]: 4

In [7]: mydict.get(2, 0)
Out[7]: 0

希望这会有所帮助。您可以将代码更改为mapfile.get([x+3], 0)

OR

from collections import defaultdict
mydict = {1:4}
mydefaultdict = defaultdict(int, mydict)
>>>mydefaultdict[1]
4
>>>mydefaultdict[2]
0

答案 3 :(得分:0)

虽然您可以通过以下方式将字典转换为defaultdict

mapfile = collections.defaultdict(int, mapfile)

在您的示例代码中,最好让它成为创建过程的一部分:

mapfile = collections.defaultdict(int, {
    1879048192: 0,
    1879048193: 0,
    1879048194: 0,
    1879048195: 0,
    1879048196: 4,
    1879048197: 3,
    1879048198: 2,
    1879048199: 17,
    1879048200: 0,
    1879048201: 1,
    1879048202: 0,
    1879048203: 0,
    1879048204: 4,
    # intentionally missing byte
    1879048206: 2,
    1879048207: 1,
    1879048208: 0 # single byte cannot make up a dword
})

print(mapfile[1879048205])  # -> 0
print(mapfile['bogus'])  # -> 0

另一种选择是派生自己的班级。它不需要太多额外的代码来实现类似字典的类,它不仅提供像defaultdict这样的缺失密钥的值,而且还对它们进行了一些健全性检查。这是我的意思的一个例子 - 一个类似dict的类,只接受丢失的键,如果它们是某种整数,而不是像常规的defaultdict那样:

import numbers

class MyDefaultIntDict(dict):
    default_value = 0
    def __missing__(self, key):
        if not isinstance(key, numbers.Integral):
            raise KeyError('{!r} is an invalid key'.format(key))
        self[key] = self.default_value
        return self.default_value

mapfile = MyDefaultIntDict({
    1879048192: 0,
    1879048193: 0,
    1879048194: 0,
    1879048195: 0,
    1879048196: 4,
    1879048197: 3,
    1879048198: 2,
    1879048199: 17,
    1879048200: 0,
    1879048201: 1,
    1879048202: 0,
    1879048203: 0,
    1879048204: 4,
    # intentionally missing byte
    1879048206: 2,
    1879048207: 1,
    1879048208: 0 # single byte cannot make up a dword
})

print(mapfile[1879048205])  # -> 0
print(mapfile['bogus'])  # -> KeyError: "'bogus' is an invalid key"