У меня есть пара вопросов о моем коде. Во-первых, у меня возникают проблемы с моими сверхвложенными циклами for, а во-вторых, есть ли у кого-нибудь советы по улучшению моего кода в целом.
Я пытаюсь написать код, который нормализует небольшой набор пространственных данных (inputD) путем сравнения столбцов из него и огромного набора эталонных данных, называемых refD, а затем возвращает возможные совпадения в новой таблице, называемой «соответствия». Сравниваемые поля:
refDs latitude, refDs longitude, inputDs lat (которую я скопировал в список, inLat), inDs long (в другом списке, inLong),
Поле refDs "nameAttested" (формальное название местоположения), поле refDs "nameTransliterated" (ради этого кода, это одно или несколько альтернативных имен местоположения), inDs nameAtt (скопировано в список, inAtt), inDs nameTrans (скопировано в список, inTrans).
Итак, для тех из вас, кто считает, это четыре списка — по одному для каждого атрибута inputDs и четыре столбца в таблице, refDs, которые будут сравниваться. Во-первых, если координаты совпадают (в пределах 5 друг от друга), записи refDs и inputDs добавляются в новую таблицу «совпадает». Затем каждый из атрибутов имени необходимо сравнить дважды — refAtt с inAtt, refTrans с inAtt, refAtt с inTrans и refTrans с inTrans, и для каждого совпадения имени атрибут количества совпадений («mCount») получает += 1. Кроме того, некоторые поля nameTrans как в refD, так и в inD содержат 0 имен или более 1.
В приведенном ниже коде показано, как я работаю над вложенным курсором вставки для моей таблицы совпадений, который перебирает мои списки inLat и inLong, передавая их и refLat и refLong в функцию расстояния по большому кругу (которую я успешно добавил). Взглянем:
# set variables
lat1 = "reprLat"
lon1 = "reprLong"
lat2 = inLat
lon2 = inLong
refAtt = refDs.nameAttested
refTrans = refDs.nameTransliterated
# insertCursor for matches Table
rows = arcpy.da.InsertCursor(matches, [lat1, lon1, lat2, lon2, refAtt, refTrans,"inAtt",
"inTrans", "mCount"])
#searchcursor for refDs
refCursor = arcpy.da.SearchCursor(refDs, ["reprLat", "reprLong"])
for i in lat2:
for x in lon2:
for y in lat1:
for z in lon1:
if great_circle(lon1[0], lat1[0], lon2[0], lat2[0]) <= 5:
rows.insertRow()
for x in inAtt:
for y in inTrans:
for z in refAtt:
for i in refTrans:
if textdistance.jaro(refAtt, inAtt) >= 0.45:
mCount += 1
elif textdistance.jaro(refAtt, inTrans) >= 0.45:
mCount += 1
elif textdistance.jaro(refTrans, inAtt) >= 0.45:
mCount += 1
elif textdistance.jaro(refTrans, inTrans) >= 0.45:
mCount += 1
Я проверил первую часть (измерение расстояний), запустив ее в Juptyer с помощью простого, если ... ‹= 5, напечатать «да», иначе напечатать «нет». И независимо от числа, относительно которого я измерял расстояния (5, 20, 100, 1000), я получал либо все «да», либо все «нет». Так что я явно что-то не так делаю. Может ли кто-нибудь сказать мне, как исправить семантику этого раздела?
Кроме того, можно ли как-то сделать все это вложение... более элегантным? Я только начал учиться программировать в этом году, и я все еще учусь многим базовым вещам и делаю элементарные ошибки.
Заранее спасибо.
rows = arcpy.da.InsertCursor(matches, [lat1, lon1, lat2, lon2, refAtt, refTrans,"inAtt", "inTrans", "mCount"])
- person Gunesh Shanbhag   schedule 16.05.2020