Python L oop Поведение при вызове внутри другого цикла - PullRequest
0 голосов
/ 30 января 2020

Я создал python функцию, которая содержит для l oop в сочетании с операторами if для итерации по каждому элементу в массиве, чтобы найти слово «Urban», содержащееся в строке, и возвращает положительный индекс, если найден, в противном случае возвращает -1, если значение не существует в строке. Ниже приведен пример вывода:

abc = np.array(crew_data['Vegetation Area'])
print(abc)
-1
 2 
-1
10
10
10

После этого l oop приступает к выполнению следующих операторов if:

if abc == -1:
  abc = str('Rural')
elif abc != -1:
  abc != str('Urban')
return(abc)

То, что здесь происходит, основано на По результатам итерации массива любому результату, возвращающему значение -1, присваивается строковое значение 'Rural', а всему, что не равно -1, присваивается строковое значение 'Urban. Ниже приведен результат при печати:

 print(abc)
 Rural
 Urban
 Rural
 Urban
 Urban
 Urban

Как показывает пример, функция при вызове выполняет операторы l oop и if и возвращает требуемый результат, однако, когда эта функция вызывается в другой для l oop результаты меняются, и кажется, что l oop (в вопросе) продолжает повторяться и дает неправильный результат. Первоначально я думал, что это могло бы быть связано с использованием того же итератора i, который используется в последующем для l oop, поэтому я изменил значение итератора на x, и ничего не изменилось.

Обратите внимание, что позже для упомянутого l oop (код не показан) без проблем вызывает ряд различных функций, однако это единственная функция, которая содержит для l oop.

Существуют ли дополнительные элементы управления? которые должны быть интегрированы в функцию, которая позволит ей корректно выполняться в последующем для l oop?

FYI, ниже приведен код функции, указанный в этом вопросе:

def area_type():
  abc= np.array(crew_data['Vegetation Area'])
  for x in abc:
      abc = x.find('Urban') 
      if abc == -1:
          abc = str('Rural')
      elif abc != -1:
          abc = str('Urban')
      return abc

Ниже приведен вывод исходного массива до преобразования значения:

 'V-Wellington 906' 'V-Wellington 906' 'V-Urban Narromine 530_1'
 'V-Tumbarumba - 78545 - Taradale' 'V-Tumut - Urban Batlow'     
 'V-Tumut - Urban Batlow' 'V-Tumut - Urban Batlow'
 'V-Tumut - Urban Batlow' 'V-Tumut - Urban Batlow'
 'V-Tumut - Urban Batlow' 'V-Tumut - Urban Batlow'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 3'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 3'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumut - 78245+78244+78240 - Back Kunama' 'V-Tumut - Urban Batlow'
 'V-Tumut - Urban Batlow' 'V-Tumut - Urban Batlow'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumut - 78245+78244+78240 - Back Kunama'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78510 - Ournie Feeder C'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78510 - Ournie Feeder C'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78510 - Ournie Feeder C'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumut - 78245+78244+78240 - Back Kunama'
 'V-Tumut - 78245+78244+78240 - Back Kunama'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumut - 78245+78244+78240 - Back Kunama'
 'V-Tumbarumba - 78510 - Ournie Feeder C'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumut - 78245+78244+78240 - Back Kunama'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78514 - Jingellic' 'V-Tumbarumba - 78514 - Jingellic'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78514 - Jingellic' 'V-Tumbarumba - 78514 - Jingellic'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B'
 'V-Tumbarumba - 78514 - Jingellic'
 'V-Tumbarumba - 78510 + 78513 - Ournie Feeder B' 'V-Tumut - Urban Batlow'
 'V-Tumut - Urban Batlow' 'V-Tumbarumba - 78520 + 78521 - Tooma Part 2'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78540 +78547 - Laurel Hill'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumbarumba - 78520 + 78521 - Tooma Part 1'
 'V-Tumut - 78316 - Talbingo' 'V-Tumut - Urban Talbingo'
 'V-Tumut - 78316 - Talbingo' 'V-Tumut - 78316 - Talbingo'
 'V-Tumut - 78316 - Talbingo' 'V-Tumut - 78316 - Talbingo'
 'V-Tumut - 78316 - Talbingo'
 'V-Gundagai - 78440+78442+78444 - Tumblong Part 2'
 'V-Gundagai - 78440+78442+78444 - Tumblong Part 2'
 'V-Gundagai - 78440+78442+78444 - Tumblong Part 2'
 'V-Gundagai - 78440+78442+78444 - Tumblong Part 2'
 'V-Tumbarumba - 78510+78511+78512 - Ournie Feeder A'
 'V-Tumbarumba - 78510+78511+78512 - Ournie Feeder A']

Этот массив извлекается из столбца импортированного CSV-файла, который сохраняется как pandas DataFrame. Функция, представленная в этом посте, должна выполнять итерацию по этому массиву, искать слово urban, возвращать индекс или логическое значение, преобразовывать это значение в Urban или Rural, а затем возвращаться и вызываться в последующем l oop для заполнения диапазон в пустом кадре данных, который затем будет экспортирован как CSV, готовый для импорта в другую базу данных.

1 Ответ

2 голосов
/ 30 января 2020

Вы вызываете бланк, безусловный возврат в первый l oop, возвращающий только первый результат. Помните, возвращение выходит из функции! Доходность и возврат

Однако существует довольно простой способ сделать это. Поскольку вы, похоже, передаете массив, вам, вероятно, понадобится вернуть результат в виде списка. Я установил свой набор данных в виде списка, так как вы не предоставили пример своего массива!

abc = ['Urban', '1', '2', '3', '5', 'Urban']
result = ['Urban' if value.find('Urban') != -1 else 'Rural' for value in abc]

result
['Urban', 'Rural', 'Rural', 'Rural', 'Rural', 'Urban']

Это может быть отличной возможностью для чтения по return и yield как а также list comprehension.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...