цикл по массиву или списку в переменных шагах - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь выяснить, как перебирать массив или список в переменных шагах.

Так, например, если у меня есть следующий список ...

a = [0,0,1,0,0,1,0]

... и я хочу использовать следующую логику:

  • Начните с индекса 0

  • Если индекс на расстоянии двух точек от 0, переместите две точки

  • Если на индекс двух точек отдалите 1,переместиться на одну точку

    Однако мне не совсем ясно, как я могу реализовать эту логику, поскольку мне кажется, что я не могу изменить свое значение индекса, которое я повторяю.

Почему этот фрагмент все еще возвращает значения от 0-6 вместо 0,3,6?

for idx,val in enumerate(a):
        print(idx)
        idx+=3

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Ваши рассуждения довольно запутанные, и я не вижу ЛЮБОГО приложения для этого, но вот как я понимаю вашу проблему ...

Причина в том, что вы не 'Фактически, возвращая значения, вы просто возвращаете индекс + 3, что неправильно с самого начала.Вы пытаетесь указать новый индекс массива на основе его значения и вернуть индекс, если он содержит значение больше 0.

Вам нужно обратиться к нужному индексу, проверьте егозначение, а затем вернуть индекс, который содержит значение.

a = [0, 0, 1, 0, 0, 1, 0]
for i, v in enumerate(a):
   if i == 0:
      print(i)
      next
   if v == 0:
      next
   else
      print(i)

Но давайте будем честными, это очень уродливо и непитонно.Давайте просто проверим, содержит ли [i] значение, и если да, вернем индекс ...

for i, v in enumerate(a):
   if v or i == 0:
      print(i)

Цель if v or i == 0 - проверить, имеет ли v значение, если так,распечатать указатель.ИЛИ, если мы смотрим на первый элемент i.

Если вы хотите ТОЧНО переместить индекс на два, вы должны установить свой индекс в начале и использовать цикл while, поскольку перечисление не может вам помочьздесь и фактически не позволяет вам перемещать индикаторы ...

a = [0, 0, 1, 0, 0, 1, 0]
i = 0
while i < len(a) - 1:   # -1 to avoid out of bounds error
   print(i)
   if a[i + 2] == 0:
      i += 2
   elif a[i + 2] == 1:
      i += 1
print(i)            # Final print statement for the last index at the end of the while loop

Я хочу поразить вас тем фактом, что это решение НЕ масштабируется с другими или большими списками, поэтому оно нерекомендуемые.Просто проверяя, существует ли значение или нет, вы гарантируете свою точность.

Вы должны просто вернуть индекс на основе того, содержит ли оно значение.Даже для очень больших списков это будет очень быстро и всегда будет масштабироваться даже для значений больше 1.

Единственная другая причина, по которой я хотел бы видеть, что вы захотите сделать это по-другому, это если вы делаетеАлгоритмы поиска строк.

0 голосов
/ 06 февраля 2019

Я считаю, что python обновляет переменные каждую итерацию.Таким образом, в конце первого запуска idx будет равен 3, но затем в начале второго запуска он сбрасывается до 1.

Если вы хотите пройти цикл на 3 с, вы все равно можете использоватьцикл for

for i in range(0,len(a),3):
  print(i)

Если вы хотите динамическое значение итерации, вам нужно использовать цикл while.

i=0
while i<len(a):
  print(i)
  if(a[i]==0):
    i+=2
  else:
    i+=1
0 голосов
/ 06 февраля 2019

Не используйте for цикл.

for циклы в Python отличаются от C или Java.В этих языках цикл for имеет начальное условие , условие завершения и приращение при каждом запуске цикла.В то время как в python цикл for - это больше цикл for each - вы даете ему итеративный объект, и он выполняет код для каждого элемента в этом итерируемом объекте.

Изменение итерируемого объекта во время его работы - плохая идея, которая может иметь трудно предсказуемые последствия и обычно нарушает ваш код.


Однако вы всегда можете использовать цикл while:

a = [0,0,1,0,0,1,0]
idx = 0

while(idx < len(a) - 2):
    print(idx)
    if a[idx + 2] == 0:
        idx += 2
    elif a[idx + 2] == 1:
        idx += 1
print(idx)

, который дает ожидаемый результат

0 1 3 4 6

Или, если вы измените приращения на 3 и 2 соответственно, а не 2 и 1,

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