Тестирование на четные буквы, почему индексация отличается внутри и вне моей функции? - PullRequest
0 голосов
/ 15 января 2020

Функция:

def func(word):
    out=[]
    for i in word:
        if i in word[0::2]:
            out.append(i.upper())
    return out

Если я запускаю

func('This is a string')

Это возвращает:

['T','I','S', ' ', 'I','S', ' ','A', ' ','S','R','I','N']

, что я и ожидал при тестировании для каждой второй буквы с позиции 0.

Принимая во внимание, что

mystring = 'This is a string'
mystring[0::2]

Вернет

'Ti sasrn'

Обратите внимание, что функция - это не мой производственный код, а точка интереса, которую я нашел и упростил ,

Ответы [ 2 ]

1 голос
/ 15 января 2020

Вы не используете for i in word: вне функции. Ваш l oop проверяет каждую букву , и в вашем значении mystring есть повторяющиеся буквы (и пробелы). Вы не проверяете, является ли их индекс четным.

Иными словами, mystring[0::2] используется как набор букв для включения в результат, это не сам результат, и Python не отслеживает, с каких индексов они пришли.

Возможно, вы ожидали, что if i in word[0::2]: примет во внимание положение в word буквы в i. Если так, то здесь ваше понимание неверно; for i in word: устанавливает i в односимвольную строку (начиная с 'T', затем 'h', затем 'i', затем 's', et c.), Но между i = 's' нет никакой связи это оригинальное местоположение в word больше. То, что 's' пришло из позиции 3 в word , не имеет значения и не записано , только то, что word[0::2] также содержит значение 's' . Обратите внимание, что word[0::2] также является просто строкой, символ ' ' в ней является просто символом пробела, Python не записал, что он пришел с позиции 4 в word изначально.

Давайте рассмотрим, что происходит в функции, шаг за шагом. Учитывая ввод 'This is a string', результат word[0::2] равен 'Ti sasrn', поэтому значения 'T', 'i', ' ', 's', 'a', 'r' и 'n' - все содержится в нем (с 's' содержится дважды ). Тогда результат теста if i in word[0::2]: в l oop для каждой буквы будет следующим:

  • i = 'T', 'T' in word[0::2] верно, 'T' добавлено.
  • i = 'h', 'h' in word[0::2] ложно.
  • i = 'i', 'i' in word[0::2] верно, добавлено 'I'.
  • i = 's', 's' in word[0::2] верно , 'S' добавлено.
  • i = ' ', ' ' in word[0::2] верно, ' ' добавлено.
  • i = 'i', 'i' in word[0::2] верно, 'I' добавлено .
  • i = 's', 's' in word[0::2] верно, 'S' добавлено.
  • i = ' ', ' ' in word[0::2] верно, ' ' добавлено.
  • i = 'a', 'a' in word[0::2] верно, 'A' добавлено.
  • i = ' ', ' ' in word[0::2] верно, ' ' добавлено.
  • i = 's', 's' in word[0::2] верно, 'S' добавлено.
  • i = 't', 't' in word[0::2] неверно, регистр имеет значение!
  • i = 'r', 'r' in word[0::2] верно, 'T' равно добавлено.
  • i = 'i', 'i' in word[0::2] верно, 'I' добавлено.
  • i = 'n', 'n' in word[0::2] верно, 'N' добавлено.
  • i = 'g', 'g' in word[0::2] ложно.

Вместе, что out содержит ['T','I','S', ' ', 'I','S', ' ','A', ' ','S','R','I','N'].

Обратите внимание, что значение 't' fro m слово string - , а не на выходе, потому что 't' не равно 'T', что равно в результате word[0::2]. При проверке на равенство строк регистр имеет значение.

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

for pos, letter in enumerate(word):
    if pos % 2 == 0:  # an even position
        out.append(letter.upper())

enumerate() дает вам кортеж (counter, value) на каждом шаге, и теперь вы делаете знать положение каждой буквы и может проверить, является ли она четной.

или, вы можете просто использовать return word[::2].upper().

0 голосов
/ 15 января 2020
for i in word:
      if i in word[0::2]:
           out.append(i.upper())

Этот код перебирает символы, и если какой-либо символ присутствует в четной позиции, он добавляет его в список out (даже если оцениваемый символ находится в нечетной позиции).

func('abb') приведет к [a, b, b], потому что, когда вычисляется второй b, функция спрашивает «присутствует ли буква b в четной позиции в моей строке?», И поскольку ответ - да , он добавляется к выводу.

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