建立计数功能

时间:2016-11-03 20:07:57

标签: python list-comprehension

我需要从字典开始建立一个计数功能。字典是经典的Bag_of_Words,如下所示:

D={'the':5, 'pow':2, 'poo':2, 'row':2, 'bub':1, 'bob':1}

我需要一个函数,对于给定的整数,它返回至少具有该出现次数的单词数。在示例F(2)= 4中,除了'bub'和'bob'之外的所有单词。

首先,我建立了D:

的逆字典
ID={5:1, 2:3, 1:2}

我觉得我很好。然后是代码:

values=list(ID.keys())
values.sort(reverse=True)
    Lk=[]
    Nw=0
    for val in values:
        Nw=Nw+ID[val]
        Lk.append([Nw, val])

代码工作正常,但我不喜欢它。关键是我更愿意使用列表理解来构建Lk;我真的吃了我用过的Nw变量。它似乎并不像pythonic

3 个答案:

答案 0 :(得分:1)

计算事物的有趣小技巧:True的数值为1,False的数值为0.所以我们可以做

之类的事情
sum(v >= k for v in D.values())

其中k是您要与之比较的值。

答案 1 :(得分:1)

你可以创建一个单词计数的排序数组,然后用np.searchsorted找到插入点,以获得它的任何一侧有多少项... np.searchsorted非常高效和快速。如果你的字典经常没有变化,那么与其他方法相比,这个电话基本上是免费的

import numpy as np

def F(n, D):
    #creating the array each time would be slow if it doesn't change move this 
    #outside the function
    arr = np.array(D.values())
    arr.sort()
    L = len(arr)
    return L - np.searchsorted(arr, n) #this line does all the work...

发生了什么......

首先我们只取字数(并转换为排序数组)......

D = {"I'm": 12, "pretty": 3, "sure":12, "the": 45, "Donald": 12, "is": 3, "on": 90, "crack": 11}
vals = np.arrau(D.values())
#vals = array([90, 12, 12,  3, 11, 12, 45,  3])

vals.sort()
#vals = array([ 3,  3, 11, 12, 12, 12, 45, 90])

然后,如果我们想知道有多少值大于或等于n,我们只需找到超出第一个数字大于或等于n的列表长度。我们通过确定将插入n的最左侧索引(插入排序)并从位置总数中减去该值(len)来实现此目的

# how many are >= 10?

# insertion point for value of 10..
#
#               | index: 2
#               v
# array([ 3,  3, 11, 12, 12, 12, 45, 90])

#find how many elements there are
#len(arr) = 8

#subtract.. 2-8 = 6 elements that are >= 10

答案 2 :(得分:1)

< p>< a href =“https://docs.python.org/2/library/collections.html#collections.Counter"rel =”nofollow noreferrer“>< code> collections.Counter()&lt ; /代码>< / A>是这个的理想选择。在< code> dict.values()< / code>上使用它们名单。此外,您无需像< code> numpy< / code>那样明确安装它们。示例示例:< / p> <预><代码>>>>来自收藏品进口柜台 >>> D = {'the':5,'pow':2,'poo':2,'row':2,'bub':1,'bob':1} >>> c =计数器(D.values()) >>> C {2:3,1:2,5:1} < /代码>< /预>