2017-01-31 4 views
0

2つのディクテーションを作成しようとしています.1つはストリート値で、もう1つはストリート値が奇数です。各通りにはRef_IDがあり、それぞれの辞書にはこれらの値をキーとして使用し、対応するシーケンス番号を値として使用します。配列を使用してdictを構築するときにキーエラーが発生する

私は値として配列で辞書を作るために、元のポストを見た: append multiple values for one key in Python dictionary

私は偶数と奇数のための条件文を考えるだけでなく、arcpy.SearchCursorを使用してが、私のコードでこれをやってみました

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 

出力は、キーと値の両方としてRef_IDです。私はちょうど私がsoemthingを得るかどうか見るためにインデックスを変更しようとしましたが、それはまだ同じです。私もstr(行[0])をeLinksで変換しようとしましたが、役に立たないです。

+1

この意志ならば、私は知りません問題を修正しますが、 'elif'の後に' if'が 'eLinks'の' row [0] 'を探していますが、おそらく' oLinks'を見るべきです。それは常に 'False'を返します。手動で初期化する必要がない(つまり、ネストされた 'if'sをスキップすることができるように)' eLinks'と 'oLinks''をdefaultdict(list)'にしたいかもしれません。 – Mikk

+0

oLinksのタイプミスを指摘してくれたMikkに感謝します。私はそれを変更してコレクションを使用しましたが、同じ結果が得られました。私はその後、入れ子式のifを取り除き、それは魅力のように働いた。先に進んで答えを投稿すれば、私はそれをチェックします。ありがとう! – ShaunO

+0

実際には、あなた自身の質問に答える必要があると思いますが、私はあなたがしたことについて100%確信していません:-) – Mikk

答えて

0

この問題は、ネストされたifにある可能性があり、これらの条件が互いにどのように相互作用するかが原因です。あなたの肩の上にあなたの辞書の標準キーのチェックの責任を取る必要はありません。そこにビルトインのデータ構造、あなたのことを行いますため:collections.defaultdicthttps://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 
関連する問題