我需要从字典开始建立一个计数功能。字典是经典的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
答案 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)