J'essaie de compter les occurrences uniquement d'éléments entiers positifs dans une liste de tests en utilisant une seule liste au lieu d'un dictionnaire pour réduire la complexité de l'espace. Mais le code ci-dessous échoue, malheureusement. Quelqu'un peut-il expliquer pourquoi?

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)
-1
Sayantan Pal 29 mars 2020 à 11:49

4 réponses

Meilleure réponse

Remplacer:

count =[0]*max(List)

Avec:

count =[0]*(max(List) + 1)
0
Shubham Sharma 29 mars 2020 à 08:53

Vous pouvez également utiliser des 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

Production:

dict_keys([5, 4, 8, 2, 9, 22, 50, 79, 66, 33])
dict_values([1, 3, 2, 1, 1, 2, 3, 1, 1, 1])

Pourquoi affiche-t-il une erreur d'index de liste?

Vous pouvez essayer d'imprimer l'index transmis à votre liste count.

Le problème vient de votre ligne count = [0] * max(List).

Vous devez mettre à l'échelle votre liste count d'ici max(List) + 1. L'indexation en Python (et de nombreux autres langages de programmation) commence par 0. J'ai essayé d'exécuter votre code et il échoue lorsqu'il essaie d'accéder au 79e index de votre liste count. 79 se trouve être le max int dans votre liste List et son index correspondant devrait être 79. Cependant, comme la taille de votre liste count était de 79, son dernier index serait 78 (car l'index commence à 0).

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

Je suppose que vous n'avez que positive integers. Si vous List n'avez pas 0 int, vous pouvez également le faire:

if count[List[i] - 1] == 0:
   distinct_element_count += 1
count[List[i] - 1] += 1
0
abhiarora 29 mars 2020 à 09:27

Vous devez en ajouter 1 ici:

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

L'indexation commence par 0 et dans votre code lorsque vous accédez par l'index 79, il échoue car le dernier est 78.

2
Anastasiia Iurshina 29 mars 2020 à 08:54

Vous ne donnez pas à compter la bonne taille:

def count_items_from_list2(List):
    count =[0] * (max(List) + 1)
0
quamrana 29 mars 2020 à 08:54