2016-05-23 11 views
-2

Ich mache einige Operationen, bei denen Daten aus einer Liste extrahiert werden, in der jedes Element ein Wörterbuch ist. Jedes Wörterbuch enthält zwei Schlüssel-Wert-Paare, die eine Zeichenfolge und dann ein int (dh {'ID': 0, 'Postleitzahl': 9414}), und dann ein Schlüssel-Wert-Paar, wo der Schlüssel eine Zeichenfolge ist, und dann eine Liste ({'Wert': [0,0,1,1,0,1]})List-Indizes müssen Ganzzahlen oder Slices sein, nicht Dict

Ich kann sehr einfach auf die Werte innerhalb dieser Liste in einem Wörterbuch in einer Liste zugreifen. Da es jedoch eine Reihe von Elementen in der Liste gibt, muss ich eine for-Schleife verwenden, um sie zu durchlaufen. Im Grunde prüft meine Methode, ob in dieser Liste in einem Diktat in einer Liste eine 1 auf dem Index steht (benutzerspezifische Nummer). Wenn dies der Fall ist, wird eine andere Liste mit den ersten beiden Schlüssel/Wert-Paaren aus dem gleichen dict aktualisiert.

So, wie folgt aus:

import returnExternalList #this method returns a list generated by an external method 

def checkIndex(b): 
    listFiltered = {} 
    listRaw = returnExternalList.returnList #runs the method "returnList", which will return the list 
    for i in listRaw: 
     if listRaw[i]['Value'][b] == 1: 
      filteredList.update({listRaw[i]['ID']: listRaw[i]['Zip Code']}) 
    print(filteredList) 

checkIndex(1) 

returnExternalList.returnList: 
[{'ID':1 ,'Zip Code':1 ,'Value':[0,1,0,0,1]},{'ID':2 ,'Zip Code':2 ,'Value':[0,0,0,0,0]},{'ID':3,'Zip Code':3 ,'Value':[0,1,1,1,0]},{'ID':4 ,'Zip Code':4 ,'Value':[1,0,0,0,0]}] 

expected output: 
[{1:1 , 3:3}] 

Ich kann for-Schleife außerhalb eines in einer Liste in einem Wörterbuch Werte in einer Liste zuzugreifen sehr einfach gerade durch dies zu tun:

print(listRaw[0]['Value'][1]) would return 1, for example. 

Beim Versuch, dieses Verhalten mit der for-Schleife zu replizieren, um jeden einzelnen in der Liste zu überprüfen, erhalte ich jedoch den Fehler:

TypeError: list indices must be integers or slices, not dict

Was mache ich?

EDIT:

def returnList: 
    listExample = [{'ID':1 ,'Zip Code':1 ,'Value':[0,1,0,0,1]},{'ID':2 ,'Zip Code':2 ,'Value':[0,0,0,0,0]},{'ID':3,'Zip Code':3 ,'Value':[0,1,1,1,0]},{'ID':4 ,'Zip Code':4 ,'Value':[1,0,0,0,0]}] 
    return listExample 

EDIT: Ich habe zwei der folgenden Lösungen angeboten, und während es der Fehler beseitigen bekommt (danke!) Ist der Ausgang einfach Da es, returnExternalList gefragt wurde, ein leeres Wörterbuch.

Code:

for i in listRaw: 
    if i['Value'][b] == 1: 
     filteredList.update({i['ID']: i['Zip Code']}) 

or 

for i in range(len(listRaw): 
    if listRaw[i]['Value'][b] == 1: 
     filteredList.update({listRaw[i]['ID']: listRaw[i]['Zip Code']}) 

EDIT:

Es funktioniert jetzt, der Grund, die Liste leer war, weil ich 1 auf '1' zu vergleichen. Es wurde behoben. Vielen Dank.

+0

möglich, den gesamten Fehler-Stack zu teilen? – glls

+0

@Glls Ich bin 100% sicher, dass es funktioniert, da, wenn ich versuche, die Liste von returnExternalList über in dieser Methode zu drucken, funktioniert es. Ich werde es nur aktualisieren, um sicher zu gehen. – user132520

+0

sieht aus wie Sie versuchen, ein dict iterieren wie die Typeerror zeigt ... – glls

Antwort

3

Wenn Sie das tun

for i in listRaw: 

Der i ist der Index nicht, es ist der eigentliche Artikel ist in der Liste (in Ihrem Fall ist es ein dict)

So müssen Sie nicht tun listRaw[i] um den Artikel zu bekommen. i selbst ist der Gegenstand. Ändern Sie Ihren Code entsprechend

+0

es zu dieser Änderung: 'for i in range (len (listRaw)): wenn listRaw [i] [ 'Value'] [b] == 1: gefilterteListe.update ({listRaw [i] ['ID']: listRaw [i] ['Postleitzahl]}) ' Jetzt bekomme ich einfach ein leeres dict als Ausgabe . – user132520

0

Hinweis: listRaw nennen [i] i muss eine ganze Zahl

listRaw[0]['Value'][1] == 1 

sein, aber ich nicht 0, wenn Sie die for-Schleife zu tun.

in Ihrem Versuch zu tun for i in range(len(listRaw)), Ihr dict. ist leer, weil die Länge von (len (listRaw)) ... 1 ist, so dass Ihre Iterationen nicht wirklich über alle Ihre Wörterbuchelemente iterieren.

Betrachten wir einige Drucke in Ihrem Code hinzufügen Debug zu helfen, kommt dies sehr praktisch in beim Start

1

Das Problem ist, dass, wenn Sie

tun
for i in listRaw: 

dies nicht, dass Sie in i einen ist Index nicht geben Es gibt Ihnen ein aktuelles Wörterbuch aus der Liste. Mit jeder Wiederholung der Schleife erhalten Sie das nächste Wörterbuch in der Liste. Sie können das Problem beheben, indem Sie diese:

def checkIndex(b): 
    filteredList = {} 
    listRaw = returnExternalList.returnList #runs the method "returnList", which will return the list 
    for d in listRaw: 
     if d['Value'][b] == 1: 
      filteredList.update({d['ID']: d['Zip Code']}) 
    print(filteredList) 

Aber das Ganze kann kurz und bündig als Wörterbuch Verständnis geschrieben werden:

def checkIndex(b): 
    print({d['ID']: d['Zip Code'] for d in returnExternalList.returnList if d['Value'][b] == 1}) 

Und ich würde geneigt sein, Ihre Funktion zu haben, um die Liste zu übernehmen als ein Argument, anstatt eine globale Variable zugreift und auf Rückkehr das Ergebnis:

def check_index(index, return_list): 
    return {d['ID']: d['Zip Code'] for d in return_list if d['Value'][index] == 1} 

>>> print(check_index(1, returnExternalList.returnList)) 
{1: 1, 3: 3}