Почему он показывает индекс списка ошибок вне диапазона? - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь подсчитать вхождения только положительных целочисленных элементов в тестовом списке, используя только один список вместо словаря, чтобы уменьшить сложность пространства. Но приведенный ниже код не работает, к сожалению. Кто-нибудь может объяснить, почему?

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 ]

2 голосов
/ 29 марта 2020

Здесь необходимо добавить 1:

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

Индексирование начинается с 0, и в вашем коде при доступе по индексу 79 происходит сбой, поскольку последний равен 78.

0 голосов
/ 29 марта 2020

Вы также можете использовать collection.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. Я попытался запустить ваш код, и он потерпел неудачу при попытке доступа к 79-му индексу в вашем списке count. 79 оказывается максимальным int в вашем списке List, и его соответствующий индекс должен быть 79. Однако, поскольку размер вашего count списка был 79, его последний индекс будет 78 (так как индекс начинается с 0).

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

Я предполагаю, что у вас есть только positive integers. Если у вас List не будет 0 int, то вы также можете сделать это:

if count[List[i] - 1] == 0:
   distinct_element_count += 1
count[List[i] - 1] += 1
0 голосов
/ 29 марта 2020

Вы не подсчитаете правильный размер:

def count_items_from_list2(List):
    count =[0] * (max(List) + 1)
0 голосов
/ 29 марта 2020

Заменить:

count =[0]*max(List)

С:

count =[0]*(max(List) + 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...