2017-01-31 6 views
0

J'essaie de construire deux dicts, un avec des valeurs de rue et même avec des valeurs de rues impaires. Chaque rue a un Ref_ID, et je veux que chaque dict utilise ces valeurs comme clés et leurs numéros de séquence correspondants comme valeurs.erreur clé lors de la construction dict avec des tableaux

je vis un ancien relais de poste pour faire un dict avec un tableau comme les valeurs: append multiple values for one key in Python dictionary

J'ai essayé de le faire dans mon code, bien que je pense que les conditionals pour pair et impair, ainsi que l'utilisation d'un arcpy.SearchCursor ajoute une certaine complexité au code:

import arcpy 

#service location layer 
fc = r"J:\Workspace\FAN3 sequencing3\gisdb\layers.gdb\Rts_239_241_314_GoLive" 

# create variables 

f1 = "Route" 
f2 = "Ref_ID" 
f3 = "Sequence" 
f4 = "Street_Number" 

# create containers 

rSet = set() 
eLinks = dict() 
oLinks = dict() 

# make a route list 

with arcpy.da.SearchCursor(fc, f1) as cursor: 
    for row in cursor: 
     rSet.add(row[0]) 
    del row 

# list of even side street sequences 
eItems = [] 
eCheckStreet = [] 

# list of odd side street sequences 
oItems = [] 
oCheckStreet = [] 

# make two dicts, one with links as keys holding sequence values for the even side of the street 
# the other for the odd side of the street 

for route in rSet: 
    with arcpy.da.SearchCursor(fc, [f2,f3,f4]) as cursor: 
     for row in cursor: 
      if row[2] != '0' and int(row[2]) % 2 == 0: 
       if row[0] in eLinks: 
        eLinks[str(row[0])].append(row[1]) 
       else: 
        eLinks[str(row[0])] = [row[0]] 
      elif row[2] != '0' and int(row[2]) % 2 != 0: 
       if row[0] in eLinks: 
        oLinks[str(row[0])].append(row[1]) 
       else: 
        oLinks[str(row[0])] = [row[0]] 
     del row 

print eLinks, oLinks 

La sortie est le Ref_ID à la fois comme la clé et la valeur. J'ai essayé de changer l'index juste pour voir si je devrais avoir quelque chose de différent mais c'est toujours la même chose. J'ai aussi essayé de convertir si str (row [0]) dans eLinks mais en vain.

+1

Je ne sais pas si cela corrige le problème, mais après 'elif', votre' if' cherche 'row [0]' dans 'eLinks', alors qu'il devrait probablement regarder dans' oLinks'. Cela retournera toujours "Faux". Vous pouvez faire à la fois 'eLinks' et' oLinks' 'defaultdict (list)', de sorte que vous n'ayez pas à initialiser manuellement (c'est-à-dire que vous pouvez ignorer les 'if's imbriqués). – Mikk

+0

Merci Mikk d'avoir signalé la faute de frappe oLinks. J'ai changé cela et utilisé des collections, mais j'ai obtenu le même résultat. Je me suis alors débarrassé de l'imbriqué si et cela a fonctionné comme un charme. Allez-y et affichez la réponse et je vais vérifier. Merci! – ShaunO

+0

En fait, je pense que vous devriez répondre à votre propre question, je ne suis pas sûr à 100% de ce que vous avez fait :-) – Mikk

Répondre

0

Le problème est probablement dans le if imbriqué et la façon dont ces conditions interagissent entre elles. Vous ne devez pas prendre sur vos épaules la responsabilité des contrôles clés standard sur votre dictionnaire: il y a une structure de données intégrée pour votre qui fait que: collections.defaultdict: https://docs.python.org/2/library/collections.html#collections.defaultdict

import arcpy 
from collections import defaultdict 

#service location layer 
fc = r"J:\Workspace\FAN3 sequencing3\gisdb\layers.gdb\Rts_239_241_314_GoLive" 

# create variables 

f1 = "Route" 
f2 = "Ref_ID" 
f3 = "Sequence" 
f4 = "Street_Number" 

# create containers 

rSet = set() 
eLinks = defaultdict(list) 
oLinks = defaultdict(list) 

# make a route list 

with arcpy.da.SearchCursor(fc, f1) as cursor: 
    for row in cursor: 
     rSet.add(row[0]) 
    del row 


# make two dicts, one with links as keys holding sequence values for the even side of the street 
# the other for the odd side of the street 

for route in rSet: 
    with arcpy.da.SearchCursor(fc, [f2,f3,f4]) as cursor: 
     for row in cursor: 
      if row[2] != '0' and int(row[2]) % 2 == 0: 
       eLinks[str(row[0])].append(row[1]) 
      elif row[2] != '0' and int(row[2]) % 2 != 0: 
       oLinks[str(row[0])].append(row[1]) 
     del row 
print eLinks, oLinks