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

Python 为什么显示列表索引超出范围错误?,python,list,count,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

我试图只使用单个列表而不是字典来计算测试列表中只出现正整数元素的次数,以降低空间复杂性。 不幸的是,下面的代码失败了。有人能解释为什么吗

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)
替换:

count =[0]*max(List)
与:


您没有为count指定正确的大小:

def count_items_from_list2(List):
    count =[0] * (max(List) + 1)

您需要在此处添加1:

count = [0] * (max(List) + 1)
索引从0开始,在代码中,当您通过索引79访问时,它会失败,因为最后一个索引是78。

您还可以使用:

输出:

dict_keys([5, 4, 8, 2, 9, 22, 50, 79, 66, 33])
dict_values([1, 3, 2, 1, 1, 2, 3, 1, 1, 1])
为什么显示列表索引超出范围错误

您可以尝试打印传递给列表计数的索引

问题在于行计数=[0]*maxList

您需要按maxList+1缩放计数列表。Python和许多其他编程语言中的索引从0开始。我试图运行您的代码,但当它试图访问计数列表中的第79个索引时失败。79恰好是列表中的最大整数,它对应的索引应该是79。然而,由于计数列表的大小是79,所以它的最后一个索引将是78,因为索引从0开始

count = [0] * (max(List) + 1)
我假设你只有正整数。如果列表中没有0 int,则还可以执行以下操作:

if count[List[i] - 1] == 0:
   distinct_element_count += 1
count[List[i] - 1] += 1

请使用完整的回溯更新您的问题。您正在尝试降低空间复杂性,但如果您的列表为[2,57],您将创建另一个大小为57的列表,这是没有充分理由的。。。结论:使用dict…非常感谢。有关计数器的信息非常有用,但listsetlist或collections中的时间复杂度很高。计数器而不是列表或字典的这种方法。我尝试在这里最小化时间和空间复杂度。太好了!别忘了投赞成票,接受我的回答!
count = [0] * (max(List) + 1)
if count[List[i] - 1] == 0:
   distinct_element_count += 1
count[List[i] - 1] += 1