Могу ли я изменить переменные вне цикла for из цикла for в python? - PullRequest
1 голос
/ 07 октября 2019

Я пытаюсь написать программу, которая подсчитывает время в списке, когда элемент больше, чем соседние соседи по обе стороны:

inp = [1, 2, 3, 2, 8, 7, 6, 9, 5]

def check(n):
    count = 0
    ind_num1 = 0
    ind_num2 = 2
    index1 = n[ind_num1]
    index2 = n[ind_num2]
    for i in n[1:-1]:
        if i > index1 and i > index2:
            count += 1
        ind_num1 += 1
        ind_num2 += 1
    return count

print(check(inp))

Мое решение - проверить, является ли значение вЦикл (i) больше, чем индексы над и под ним, при этом каждый раз добавляя по одному к каждому смежному индексу через цикл. ind_num1 и ind_num2 показывают правильные значения в ходе цикла. Тем не менее, index1 и index2 остаются неизменными, а не постепенно увеличиваются в соответствии со значениями ind_num1 и `ind_num2 '. Почему они не меняются?

1 Ответ

0 голосов
/ 08 октября 2019

Причина, по которой ind_num1 и ind_num2, по-видимому, не влияют на index1 и index2, заключается в том, что вы увеличиваете первые две переменные в цикле, но вы присвоили значения index1и index2 вне петли. Следовательно, index1 и index2 всегда будут оставаться 0 и 2 соответственно. Если вы хотите, чтобы index1 и index2 точно отражали значения ind_num1 и ind_num2, вам необходимо обновлять значения index1 и index2 внутри цикла с каждой итерацией цикла.

inp = [1, 2, 3, 2, 8, 7, 6, 9, 5]

def check(n):
    count = 0
    ind_num1 = 0
    ind_num2 = 2
    for i in n[1:-1]:
        index1 = n[ind_num1]
        index2 = n[ind_num2]
        if i > index1 and i > index2:
            count += 1
        ind_num1 += 1
        ind_num2 += 1
    return count

print(check(inp))

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

inp = [1, 2, 3, 2, 8, 7, 6, 9, 5]

def check(n):
  count = 0
  for e,i in enumerate(inp):
    follIndex = e+1 if e+1 < len(n) else 0 # Changes index of following item to 0 if comparing last item in the list.
    if i > inp[e-1] and i > inp[follIndex]:
      count += 1
  return count

print(check(inp)) # Returns and prints '3' because three values (3, 8, 9)
                  # are bigger than both of the adjacent values in the list.

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

Цель отслеживания текущего индекса, или e, заключается в том, чтобы вы могли легко получить доступ к смежным элементам списка через inp[e-1] и inp[e+1].

Это позволяет вам избавиться отиз множества ненужных переменных.


Поскольку вы не хотите сравнивать первый или последний элементы, вы должны сделать следующее:

inp = [1, 2, 3, 2, 8, 7, 6, 9, 5]

def check(n):
  count = 0
  for e,i in enumerate(n[1:-1]):
    if i > n[e] and i > n[e+2]:
      count += 1
  return count

print(check(inp))

Вы используете enumerate дляопределить количество итераций (т. е. 0, 1, ... 6) как e. Это значение (например, e) используется для определения соседних элементов списка (например, n[e] and n[e+2]), что позволяет избавиться от всех этих ненужных переменных. FWIW, i по существу равно e+1.

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