开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情
今天朋友给了我一个问题,就是类似统计词频的题目。但是这里面统计的不是词,是矩阵。查阅资料,目前没有这方面的内容,算是一个比较小众的问题,这里记录并解决这个问题的过程。
统计词频的一般方法
一般来说,我们统计词频用的方法是这样的。用一个字典count,key值为要计数的词,对应的value则为词频。
nums=[1,2,1,3]
count={}
for i in nums:
count[i]=count.get(i,0)+1
print(count) # {1: 2, 2: 1, 3: 1}
这里的
count.get(i,0),表示从count取key为i对应的value,如果没有的话,返回0.
统计列表(一维)的方法
按照上面的方法,我们把nums里面的元素换为列表应该就好了。
nums=[[1,2,2,3,3],[1,2,2,3,3],[1,2,2,3,4]]
count={}
for i in nums:
count[i]=count.get(i,0)+1
print(count)
这里面就出现问题了。
这里的意思是,list这个数据类型不能哈希不能作为字典的key。这里要说明一点,可变数据类型(如列表,字典)都是不能哈希的的。只有不可变数据类型(如字符串,元组)才是可以哈希的。
所以,思路就是比较清晰的把列表转换成字符串或者元组问题就解决了。这里选择转换成元组的方法:
nums=[[1,2,2,3,3],[1,2,2,3,3],[1,2,2,3,4]]
for i in range(len(nums)):
nums[i]=tuple(nums[i])
count={
for i in nums:
count[i]=count.get(i,0)+1
print(count) # {(1, 2, 2, 3, 3): 2, (1, 2, 2, 3, 4): 1}
统计矩阵(高维列表)的方法
我们把数据换成高维列表,结果仍然出现了问题。
这是因为,元组内仍然包含列表元素,仍然不能被哈希。所以,需要循环嵌套转元组。
nums=[[[1,2,2,3,3],[1,2,2,3,3],[1,2,2,3,4]],[[1,2,2,3,3],[1,2,2,3,3],[1,2,2,3,4]],[[1,2,2,3,3],[1,2,2,3,3],[1,2,2,3,5]]]
for i in range(len(nums)):
nums[i]=tuple(map(tuple,nums[i]))
count={}
for i in nums:
count[i]=count.get(i,0)+1
print(count) # {((1, 2, 2, 3, 3), (1, 2, 2, 3, 3), (1, 2, 2, 3, 4)): 2, ((1, 2, 2, 3, 3), (1, 2, 2, 3, 3), (1, 2, 2, 3, 5)): 1}
这里就是二维的,多维的需要再次嵌套,这里面应该是有一些办法能够解决高维的,不用这么复杂的挨个维度转换,可以自己找找看。
总结
这个问题其实就两个关键点。