我试图仅使用单个列表而不是字典来计算测试列表中仅正整数元素的出现,以减少空间复杂性。 但是不幸的是,下面的代码失败了。谁能解释为什么?
def count_items_from_list2(List):
count =[0]*max(List)
'''
from collections import defaultdict
count = defaultdict(lambda:0)
'''
distinct_element_count=0
for i in range(len(List)):
if count[List[i]]==0:
distinct_element_count+=1
count[List[i]]+=1
return [(List[i],count[List[i]]) for i in range(len(List))],distinct_element_count
List = [5,4,8,2,4,9,22,50,79,22,50,50,66,33,8,4]
items_count,distinct_elements = count_items_from_list2(List)
print("Count of all items: ",items_count)
print("No of distinct elements: ",distinct_elements)
答案 0 :(得分:2)
您需要在此处添加1:
db.collection.find({fruits:{$all:[ 'apple', 'orange', 'banana', 'peach']}})
索引从0开始,在您的代码中通过索引79访问时,索引失败,因为最后一个是78。
答案 1 :(得分:0)
替换:
count =[0]*max(List)
使用方式:
count =[0]*(max(List) + 1)
答案 2 :(得分:0)
您给的计数不正确:
def count_items_from_list2(List):
count =[0] * (max(List) + 1)
答案 3 :(得分:0)
您也可以使用collections.Counter:
from collections import Counter
List = [5,4,8,2,4,9,22,50,79,22,50,50,66,33,8,4]
print(Counter(List).keys()) # equals to list(set(List ))
print(Counter(List).values()) # counts the element's frequency
输出:
dict_keys([5, 4, 8, 2, 9, 22, 50, 79, 66, 33])
dict_values([1, 3, 2, 1, 1, 2, 3, 1, 1, 1])
为什么显示列表索引超出范围错误?
您可以尝试打印传递到列表count
的索引。
问题出在您的行count = [0] * max(List)
上。
您需要按count
来缩放max(List) + 1
列表。 Python(和许多其他编程语言)中的索引从0开始。我尝试运行您的代码,当它尝试访问count
列表中的第79个索引时,它失败了。 79恰好是列表List
中的最大整数,它的对应索引应为79
。但是,由于您的count
列表的大小为79,所以它的最后一个索引为78(因为索引从0开始)。
count = [0] * (max(List) + 1)
我假设您只有positive integers
。如果List
的int值不为0,那么您也可以这样做:
if count[List[i] - 1] == 0:
distinct_element_count += 1
count[List[i] - 1] += 1