Бештар

Сохтани луғат аз арзишҳои соҳаи синфи хусусиятҳо, чӣ гуна ман метавонам кафолат диҳам, ки дар як калид арзиши такрорӣ вуҷуд надорад


Ман ин намунаи кодро ёфтам, ки луғатро аз ду майдон месозад; натиҷаи ниҳоӣ муттаҳидсозии ҳама арзишҳо барои як калид ба майдони нав мебошад. Ин як воситаи олӣ аст, ба истиснои он ки он барои ҳар як калид арзиши такрорӣ ҳисоб намекунад. Ман кӯшиш кардам, ки кодро тағир диҳам, то арзиши луғатро тафтиш кунам ва агар он мавҷуд набошад онро бо аввал илова кунед луғат [id] = арзиш изҳорот, аммо он дубора дубора нигоҳ дошта мешавад. Вақте ки ман ҳамон чекро бо дуввум месупорам луғат [id] = арзиш изҳорот, он танҳо навиштани арзиши охиринро анҷом медиҳад, агар дар майдон пайдо шавад. Ман чӣ намерасам? Ман инчунин итминон надорам, ки ҳадафи "A" ҳо дар параметрҳои SearchCursor чист. Қисми коде, ки ман бояд тағир диҳам, дар зер аст:

# Курсорро дар синфи хусусӣ ё ҷадвал ҷойгир кунед, то объектҳои сатрро такрор кунед ва арзишҳои майдонро гиред. # Қиматҳои курсори ҷустуҷӯро дар асоси CaseField ва ReadFromField бо тартиби афзоиш ҷудо кунед. # Муайян кунед, ки пас аз ҳар як сатр ҳаракат кардани курсор чӣ мешавад. # Ҳангоме ки дар ҳар як сатр аст, он арзиши майдони CaseField -ро, ки шумо барои итератсия ҳамчун id истифода мебаред, мегирад. # Ҳангоме ки он дар навбат аст, он инчунин арзиши майдони ReadFromField -ро мегирад, ки шумо мехоҳед пайваст кунед. # Арзиши луғатро ба арзишҳое, ки курсор аз ReadFromField хондааст, таъин кунед. # Шарти if -ро муқаррар кунед, ки курсор ҳангоми хондани майдонҳои дорои ҳамон ID ё арзиши CaseField бояд чӣ кор кунад. # Дар ҳолати шарт арзиши навро ба арзиши охирини ReadFromField + ҷудокунандаи муайяншуда + арзиши нави хондашуда таъин кунед. # Боз арзиши луғатро ба ин арзиши нав таъин кунед. # Доираро тавре созед, ки lastidро ба IDе, ки шумо аз getValue гирифтаед, пеш аз он ки аз ҳалқаи сония гузарад ва ғайра дошта бошад ... # Тағирёбандаи арзиши охиринро ба арзиши охирини хондашуда тавре гузоред, ки он бо он арзиши охирини ҳалқаи дуюм ва ғайра ... cur1 = arcpy.SearchCursor (InputTable, "", "", "", CaseField +"A;" +ReadFromField +"A") барои сатр дар cur1: id = row.getValue (CaseField) #if арзиш дар луғат нест: value = row.getValue (ReadFromField) луғат [id] = арзиш агар id == lastid: value = str (lastvalue) + Ҷудокунанда + str (арзиш) #if арзиш дар луғат набошад: луғат [id ] = арзиши lastid = id lastvalue = арзиш

Навсозӣ: Ман кӯшиш кардам, ки ҳалли defaultdict -ро татбиқ кунам, аммо ҳангоми кӯшиши нав кардани майдон бо арзишҳои пайвастшуда хато гирифтам. Ин аст рамзи навшуда ва хатои гирифтаи ман дар зер аст:

# Курсорро дар синфи хусусӣ ё ҷадвал ҷойгир кунед, то объектҳои сатрро такрор кунед ва арзишҳои майдонро гиред. # Қиматҳои курсори ҷустуҷӯро дар асоси CaseField ва ReadFromField бо тартиби афзоиш ҷудо кунед. # Муайян кунед, ки вақте ки курсор дар ҳар як сатр мегузарад, чӣ мешавад. # Ҳангоме ки дар ҳар як сатр аст, он арзиши майдони CaseField -ро, ки шумо барои итератсия ҳамчун id истифода мебаред, мегирад. # Ҳангоме ки он дар навбат аст, он инчунин арзиши майдони ReadFromField -ро мегирад, ки шумо мехоҳед пайваст кунед. # Арзиши луғатро ба арзишҳое, ки курсор аз ReadFromField хондааст, таъин кунед. # Шарти if -ро муқаррар кунед, ки курсор ҳангоми хондани майдонҳои дорои ҳамон ID ё арзиши CaseField бояд чӣ кор кунад. # Дар ҳолати шарт, арзиши навро ба арзиши охирини ReadFromField + ҷудокунандаи муайяншуда + арзиши нави хондашуда таъин кунед. # Боз арзиши луғатро ба ин арзиши нав таъин кунед. # Доираро тавре созед, ки lastidро ба IDе, ки шумо аз getValue гирифтаед, пеш аз он ки аз ҳалқаи сония гузарад ва ғайра ... ҳалқаи дуюм ва ғайра ... cur1 = arcpy.SearchCursor (InputTable, "", "", "", CaseField +"A;" +ReadFromField +"A") барои сатр дар cur1: id = row.getValue (CaseField) value = row.getValue (ReadFromField) луғат [id] = арзиш агар id == lastid: value = str (lastvalue) + Delimiter + str (value) Dictionary [id] = lastid = id lastvalue = value # Курсор ва сатрро нест кунед объектҳо барои хориҷ кардани қулфи додаҳо, ки то анҷом ёфтани # скрипт ё нест кардани объекти курсор боқӣ мемонанд. del cur1, сатри # Ворид кардани курсори навсозӣ барои навсозӣ ё нест кардани сатрҳо дар синфи хусусиятҳо, shapefile ё ҷадвал. # Муайян кунед, ки вақте ки курсор дар ҳар як сатр мегузарад, чӣ мешавад. # Ҳангоме ки шумо дар ҳар сатр ҳастед, курсорро таъин кунед, то арзиши CaseField -ро, ки ҳамчун итератсия барои такрор истифода мешавад, гиред. # Арзиши майдонеро таъин кунед, ки арзишҳои муттаҳидшуда бояд бо арзишҳои луғатӣ, ки шумо дар коди боло пайваст кардаед, навишта шавад. # Курсорро танзим кунед, то ки арзишҳои сатрро бо арзишҳои луғат навсозӣ кунанд. cur2 = arcpy.UpdateCursor (InputTable) барои сатр дар cur2: id = row.getValue (CaseField) row.setValue (CopyToField, луғат [id]) cur2.updateRow (сатр)

Маълумот дар бораи хато: : Row: Арзиши вуруди нодуруст барои SetValue


Пеш аз он ки калид илова кунед, луғати мавҷударо тафтиш кунед, то бубинед, ки арзиши пешниҳодшуда аллакай дар он аст.

Агар ин тавр бошад, онро гузаред, аммо агар ин тавр набошад, шумо онро илова хоҳед кард.

Ин POST тафтиши калидҳоро дар python тавсиф мекунад.

Асосан, шумо чунин кореро анҷом медодед:

агар newValue дар myDictionary: #дигар коре накунед: #ба луғат илова кунед

Ҳамчунин барои гирифтани маълумоти бештар ба ҳуҷҷатҳо дар бораи луғатҳо нигаред.

Барои маълумот дар бораи параметрҳои 'A', он ба як варианти ҷобаҷогузории сатрҳо монанд аст. Ҳуҷҷатҳои ESRI -ро хонед, то SearchCursor -ро бештар танзим кунед.


Шумо метавонед инро бо ёрии aҳукми пешфарз аз танзим карданс:

маҷмӯаҳои воридотӣ my_items = collections.defaultdict (маҷмӯа) барои сатр дар cur1: id = row.getValue (CaseField) value = row.getValue (ReadFromField) my_items [id] .add (value)

Ҳоло ҳар як калиди луғат бо маҷмӯи арзишҳои беназири ин ID пур карда мешавад.