Python统计列表数目(非列表内元素数目)

133 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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)

这里面就出现问题了。 image.png

这里的意思是,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}

统计矩阵(高维列表)的方法

image.png

我们把数据换成高维列表,结果仍然出现了问题。

image.png

这是因为,元组内仍然包含列表元素,仍然不能被哈希。所以,需要循环嵌套转元组。

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}

这里就是二维的,多维的需要再次嵌套,这里面应该是有一些办法能够解决高维的,不用这么复杂的挨个维度转换,可以自己找找看。

总结

这个问题其实就两个关键点。

1.字典的key不能为可变数据类型。

2.高维列表的嵌套转换数据类型