我正在尝试使用dict从大数组中跟踪可见的元素。 有没有一种方法可以将字典对象强制为整数类型,并在初始化时默认将其设置为零?
我用非常笨拙的代码和两个循环来完成此操作。
这是我现在要做的:
static async getInitialProps({req,res}) {
console.log(req.headers.cookie); // Unhandled Rejection (TypeError): Cannot read property 'headers' of undefined.
}
答案 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.defaultdict
和collection.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
更快。