2017-10-14 1 views
1

J'utilise une liste imbriquée qui contient divers types de crimes. Pour clarifier, crimeDescription est formaté en tant que tel: [['Murder'], ['Assault'], ... , ['Stalking'], ['Rape']]. Je cherche à créer un dictionnaire qui contiendra chaque valeur/crime qui est dans cette liste et enregistrer sa fréquence, ou à quelle fréquence il apparaît dans l'ensemble de données. Puisque les clés à l'intérieur des dictionnaires ne peuvent pas être des listes, j'essaie d'accéder à la chaîne à l'intérieur de chaque liste imbriquée, en appelant son index i [0] dans la boucle for. Quand je lance le programme suivant:Python - Transformer une liste imbriquée dans un dictionnaire?

#TypesOfCrime --> a List containing all different types of crime that's happened in LA 

TypesOfCrime = [] 
CrimeFreq = {} 
for i in crimeDescription: 
    if i not in TypesOfCrime: 
     i = i[0] 
     CrimeFreq[i] = 1 
    elif i in TypesOfCrime: 
     i = i[0] 
     CrimeFreq[i] += 1 

Je reçois l'erreur suivante:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-75-a8698e79e96a> in <module>() 
     5  if i not in TypesOfCrime: 
     6   TypesOfCrime.append(i) 
----> 7   CrimeFreq[i[0]] = 1 
     8  elif i in TypesOfCrime: 
     9   CrimeFreq[i[0]] += 1 

TypeError: 'float' object is not subscriptable 

Qu'est-ce que je fais mal? Comment puis-je créer un dictionnaire contenant chaque valeur différente de ma liste imbriquée? Tout conseil sera utile.

+1

Um, y a-t-il une bonne raison que vous ayez une liste de listes d'éléments uniques? En outre, ce message d'erreur n'est pas cohérent avec le code d'exemple. S'il vous plaît fournir un [mcve] –

+0

@ juanpa.arrivillaga Voilà comment j'ai reçu l'ensemble de données. J'aimerais transformer le contenu d'une manière qui serait utile, et c'est ce que j'essaie de faire dans les instructions if, mais obtenir cette TypeError ... des idées? – user7366442

+0

Qu'est-ce que 'crimeDescription', est-ce juste une chaîne décrivant chaque' TypesOfCrime'? – davedwards

Répondre

0

Pour compter quelque chose avec un dict, vérifiez si la clé existe déjà et augmenter la valeur, sinon ajoutez la clé avec la valeur 1:

crime_freq = {} 

for current_crime in crimeDescription: 
    crime = current_crime[0] 
    if crime in crime_freq: 
     crime_freq[crime] += 1 
    else: 
     crime_freq[crime] = 1 

La façon moderne pour résoudre votre problème est d'utiliser un collections.Counter et une expression du générateur:

crime_freq = collections.Counter(crime[0] for crime in crimeDescription) 
0

voulez-vous si la clé ne existence, la valeur créée ou si l'existence clé, valeur ajoutée.

Je recommande l'utilisation de la méthode setdefault().

crime_freq = {} 

for current_crime in crimeDescription: 
    crime = current_crime[0] 
    crime_freq.setdefault(crime, 0) 
    crime_freq[crime] += 1 

Si vous utilisez la méthode setdefault(), le code est simple.

J'utilise généralement la méthode setdefault() fréquemment.