ArcGIS Field Calculator: синтаксическая ошибка условного оператора

Здесь работают рудиментарные навыки Python/ArcPy, не знаю, где я ошибаюсь.

Попытка сделать простой случайный выбор 10 объектов из слоя, который будет обозначен размещением «1» в другом атрибуте, отведенном для этой цели. Основная идея состоит в том, чтобы использовать random.sample() для создания случайного списка из 10 FID, а затем проверить, есть ли каждый FID в списке. NewID — это атрибут, содержащий значения FID. Это то, что у меня есть в блоке кода:

import random
def randSelTen():
      featurecount = arcpy.GetCount_management("layer_name")
      linecount = int(str(featurecount))
      lst_oids = range(0, linecount)
      rand_lines = random.sample(lst_oids, 10)
      if !NewID! in rand_lines:
           return 1
      else:
           return 0

Я продолжаю получать синтаксическую ошибку в условном выражении, содержащем !NewID!, и что бы я ни делал, я не могу это исправить. Если я заменю !NewID! с целым числом скрипт запускается, но, конечно, результат плохой. Любая помощь приветствуется... спасибо!


person three2112    schedule 11.10.2018    source источник
comment
Что именно ты пытаешься сделать? Если вы хотите найти строку !NewID! в rand_lines, вы должны отформатировать ее как строку: if '!NewID!' in rand_lines'   -  person toti08    schedule 11.10.2018
comment
Спасибо... Я пытаюсь использовать Field Calculator для подсчета функций в shp, построить строку, состоящую из случайной выборки 10 FID, проверить, есть ли каждый FID в строке, и заполнить другой атрибут значением 1. или 0, если FID находится в строке образца.   -  person three2112    schedule 11.10.2018
comment
С вашей поправкой скрипт запускается, но у меня на выходе все нули. Я думаю, проблема сейчас в том, что новый набор из 10 случайных признаков генерируется с каждой итерацией вычисления поля, а это не то, чего я хочу... Я хочу использовать один и тот же список из 10 случайных признаков для каждой итерации, который должен оставить меня с десятью единицами. Может быть, это невозможно с калькулятором поля? Спасибо еще раз!   -  person three2112    schedule 11.10.2018
comment
Вы делаете это в инструменте Калькулятор поля в ArcMap или в скрипте с помощью функции arcpy.CalculateField_management()? Пожалуйста, смотрите мой ответ ниже   -  person BigGerman    schedule 11.10.2018


Ответы (1)


Если вы помещаете этот код в «Кодовый блок» калькулятора полей, то причина, по которой вы получаете синтаксическую ошибку, заключается в том, что вы не можете получить доступ к таким полям из кодового блока. Вы должны передать это поле в качестве аргумента функции. Итак, вам придется сделать это:

# -----Codeblock---------
import random
def randSelTen(NewID):
  featurecount = arcpy.GetCount_management("layer_name")
  linecount = int(str(featurecount))
  lst_oids = range(0, linecount)
  rand_lines = random.sample(lst_oids, 10)
  if NewID in rand_lines:
       return 1
  else:
       return 0

# ----- Expression (goes in bottom text box of the field calculator if using GUI) -----
randSelTen(!NewID!)
person BigGerman    schedule 11.10.2018