为什么显示列表索引超出范围错误?

时间:2020-03-29 08:49:10

标签: python list count

我试图仅使用单个列表而不是字典来计算测试列表中仅正整数元素的出现,以减少空间复杂性。 但是不幸的是,下面的代码失败了。谁能解释为什么?

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)

4 个答案:

答案 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