Как работает эта строка кода? (Python, функция) - PullRequest
0 голосов
/ 02 мая 2018
def superindex(string, word):
    return [i for i, ltr in enumerate(string) if ltr == word]

Я новичок в Python, и я хотел бы знать, как это выглядит.

  1. Как это создать список?
  2. Что делает i for i?

Ответы [ 4 ]

0 голосов
/ 02 мая 2018

Эта функция создает список ltr индексов итерируемой переменной string, соответствующих объекту word

Эта функция может быть написана более простым способом:

    def superindex(string, word):
        l = list()
        for i, ltr in enumerate(string):
            if ltr == word: # check if ltr is equal to the variable word
                l.append(i) # append the index i of the matching ltr in the string
        return l

enumerate

  • Функция перечисления позволяет нам зацикливаться на чем-то и иметь автоматический счетчик
  • Здесь каждому 'ltr' в переменной 'string' присваивается номер 'i' (начиная с нуля)

[i for i...

Эта функция будет работать с буквами:
superindex('foo', 'o')
возвращает [1,2]

, а также списки слов:
superindex(['foo', 'bar'], 'bar')
возвращает [1]

Примечание. Хотя переменные предполагают, что это применимо к строке и словам, более подходящим наименованием может быть (list_of_strings и word) или (string и letter). Если искать более общий случай, возможно (iterable и template) ...

0 голосов
/ 02 мая 2018

Возвращает индексы, в которых буква word соответствует символу в переменной string.

for i, ltr in enumerate(string) - это цикл for для букв в string, поскольку при использовании перечисления вы также получаете индекс i. Однако добавление условия if в конце означает, что вы возвращаете i только тогда, когда буква ltr равна букве word

Итак, это

string = "yuppers"
word = "p"
print(superindex(string, word))

вернет это

[2,3]

0 голосов
/ 02 мая 2018

Простой способ понять однострочный цикл - использовать более простые вещи:

>>> l = ["a", "b", "c"]
>>> [ltr for ltr in l]
['a', 'b', 'c']

Для вашего первого вопроса использование квадратных скобок создает список, и он добавляет значение ltr в список, перебирая список l.

enumerate - это встроенная функция, которая позволяет иметь счетчик при циклическом повторении итерируемого объекта. Здесь i перебирает индексы списка, в то время как ltr перебирает элементы списка l. Вот еще один пример:

>>> [i for i, ltr in  enumerate(l)]
[0, 1, 2]
>>> [ltr for i, ltr in  enumerate(l)]
['a', 'b', 'c']

Additioanlly, у вас есть условие в конце:

>>>[ltr for i, ltr in  enumerate(l) if i>0]
['b', 'c']

Здесь используются только элементы списка l с индексами, большими 0.

Надеюсь, это поможет понять концепции:)

0 голосов
/ 02 мая 2018

Было бы гораздо проще понять, если бы оно было написано так:

lst = []
for i, ltr in enumerate(string):
    if (ltr == word):
        lst.append(i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...