用零初始化字典

时间:2019-03-24 14:48:31

标签: python dictionary

我正在尝试使用dict从大数组中跟踪可见的元素。 有没有一种方法可以将字典对象强制为整数类型,并在初始化时默认将其设置为零?

我用非常笨拙的代码和两个循环来完成此操作。

这是我现在要做的:

static async getInitialProps({req,res}) {
     console.log(req.headers.cookie); // Unhandled Rejection (TypeError): Cannot read property 'headers' of undefined.
}

3 个答案:

答案 0 :(得分:3)

您可以使用collections.Counter

from collections import Counter
Counter([0, 1, 1, 2, 1, 3, 4])

输出:

Counter({1: 3, 0: 1, 2: 1, 3: 1, 4: 1})

然后您可以像字典一样对它进行寻址:

>>> Counter({1: 3, 0: 1, 2: 1, 3: 1, 4: 1})[1]
3
>>> Counter({1: 3, 0: 1, 2: 1, 3: 1, 4: 1})[0]
1

答案 1 :(得分:0)

当然,只需使用collections.defaultdict([default_factory[, ...]])

from collections import defaultdict

fl = [0, 1, 1, 2, 1, 3, 4]

seenit = defaultdict(int)

for val in fl:
    seenit[val] += 1

print(fl)
# Output
defaultdict(<class 'int'>, {0: 1, 1: 3, 2: 1, 3: 1, 4: 1})

print(dict(seenit))
# Output
{0: 1, 1: 3, 2: 1, 3: 1, 4: 1}

此外,如果您不想导入collections,则可以使用dict.get(key[, default])

fl = [0, 1, 1, 2, 1, 3, 4]

seenit = {}

for val in fl:
    seenit[val] = seenit.get(val, 0) + 1

print(seenit)
# Output
{0: 1, 1: 3, 2: 1, 3: 1, 4: 1}

此外,如果您只想解决问题而又不介意使用 字典,则可以使用collection.counter([iterable-or-mapping])

from collections import Counter

fl = [0, 1, 1, 2, 1, 3, 4]

seenit = Counter(f)

print(seenit)
# Output
Counter({1: 3, 0: 1, 2: 1, 3: 1, 4: 1})

print(dict(seenit))
# Output
{0: 1, 1: 3, 2: 1, 3: 1, 4: 1}

collection.defaultdictcollection.Counter都可以读作dictionary[key],并支持.keys().values().items()等的使用。它们是普通词典的子类。

如果您想谈谈性能,我用timeit.timeit()检查了字典的创建以及执行一百万次执行的循环:

  • collection.defaultdic:2.160868141秒
  • dict.get:1.3540439499999999秒
  • collection.Counter:4.700308418999999秒

collection.Counter可能更容易,但更慢。

答案 2 :(得分:0)

使用val in seenit.get()快一点:

seenit   = dict()
for val in fl:
    if val in seenit :
        seenit[val] += 1
    else:
        seenit[val] = 1

对于更大的列表,Counter最终将胜过所有其他方法。并且defaultdict将比使用.get()val in seenit更快。