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.
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
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
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