在python字典中处理可能的空值

时间:2017-10-19 17:36:45

标签: python-2.7 numpy

我使用以下代码计算两个值(1,-1)的出现次数:

import numpy as np

a = np.empty(0, dtype=np.int)
tmp = [-1,1,1,1,1,1,-1, 1, -1]
a = np.append(a, tmp)

unique, counts = np.unique(a, return_counts=True)
r = dict(zip(unique, counts))
print r
if r.values()[0] > r.values()[1]:
    print r.keys()[0]
else:
    print r.keys()[1]

问题是tmp有时可能都是1或-1,导致打印失败。我能想到的可能的解决方案是添加零值的类似null的键。例如,当tmp=[1,1,1,1]时,r应为{1: 4, -1: 0},反之亦然。如何修改此代码?

谢谢

3 个答案:

答案 0 :(得分:1)

给出输入列表/数组仅包含-11的一个技巧是使用偏移数组(偏移1,使-1为0,1为2)进行分箱计数np.bincount,然后使用2的步长进行切片,以考虑计算-11 -

dict(zip([-1,1],np.bincount(a+1,minlength=3)[::2]))

样品运行 -

In [954]: a = np.array([-1,1,1,1,1,1,-1,1,-1])

In [955]: dict(zip([-1,1],np.bincount(a+1,minlength=3)[::2]))
Out[955]: {-1: 3, 1: 6}

In [956]: a = np.array([-1,-1,-1,-1])

In [957]: dict(zip([-1,1],np.bincount(a+1,minlength=3)[::2]))
Out[957]: {-1: 4, 1: 0}

In [958]: a = np.array([1,1,1,1])

In [959]: dict(zip([-1,1],np.bincount(a+1,minlength=3)[::2]))
Out[959]: {-1: 0, 1: 4}

如果您只需要-11中的哪一个具有更大的数量,只需执行 -

np.bincount(a+1,minlength=3).argmax()-1

答案 1 :(得分:0)

只是免费,说你有

>>> uvalues = [-1,1]

代表要计算的值列表。

{uvalue:r.get(uvalue,0) for uvalue in uvalues}

怎么样?

<小时/> 用例

>>> a = np.array([-1,-1, -1, -1])
>>> unique, counts = np.unique(a, return_counts=True)
>>> r = dict(zip(unique, counts))
>>> r
{-1: 4}
>>> {uvalue:r.get(uvalue,0) for uvalue in uvalues}
{1: 0, -1: 4}

答案 2 :(得分:0)

使用collections.Counter的其他自然(快速)解决方案:

from collections import Counter

tmp = [1,1,1,1,1,1]    
c=Counter({1:0,-1:0}) # init
c.update(tmp)
#Counter({-1: 0, 1: 6})