Не в состоянии понять Python3 enumerate()

#python #python-3.x

#python #python-3.x

Вопрос:

Вопрос: Учитывая массив целых чисел, верните индексы двух чисел таким образом, чтобы они в сумме соответствовали определенной цели.

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

Пример:

Заданные числа = [2, 7, 11, 15], цель = 9,

Потому что nums[0] nums[1] = 2 7 = 9, возвращает [0, 1].

 class Solution:
def twoSum(self, nums, target):

    lookup={}
    for cnt, num in enumerate (nums):
        if target-num in lookup:
            return lookup[target-num], cnt
        lookup[num]=cnt
  

Я не в состоянии понять шаги после использования цикла for.Я новичок в Python, кто-нибудь, пожалуйста, помогите мне.

Комментарии:

1. enumerate(items) возвращает (idx, item) для каждого элемента в items и idx начинается с 0 , если не указано иное

2. if target-num in lookup: что это значит?

3. if target-num in lookup означает «если словарь lookup содержит target-num в качестве ключа»

Ответ №1:

Позвольте мне помочь вам понять, объяснив, что делает код и как он решает проблему.

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

Поскольку нам нужно возвращать индексы, мы хотим иметь возможность искать пары число-цель и немедленно получать индекс. Решение использует словарь для хранения числа (ключа) и возврата индекса как (значения).

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

Часть перечисления просто предоставляет индекс вместе со значением массива, который выполняется итерацией, в форме (id, item).

 class Solution:
    def twoSum(self, nums, target):
        # Here a dictionary is created, which will store value, index as key, value pairs.
        lookup={}
        # For every number in the array, get the index (cnt) and number (num)
        for cnt, num in enumerate (nums):
            # If we find target-num, we know that num   target-num = target
            if target-num in lookup:
                # Hence we return the index of the target-num we stored in the dict, and the index of the current value (cnt)
                return lookup[target-num], cnt
            # Otherwise we store the current number as key with its index as value
            lookup[num]=cnt
  

Ответ №2:

enumerate() метод добавляет счетчик к итерируемому и возвращает его в виде объекта enumerate. Этот объект enumerate затем может быть использован непосредственно в циклах for или преобразован в список кортежей с помощью метода list().

Например,
>>>list(enumerate("abc"))

Выдает

 [(0, 'a'), (1, 'b'), (2, 'c')]
  

Для удобства понимания я комментирую вашу программу. Пройдитесь по нему, вы наверняка поймете.

 class Solution:
def twoSum(self, nums, target):
    
    # lookup is a dictionary that stores the number and its index 
    # e.g. '{7:1}'
    #     number 7 at index 1 
    lookup={}

    # As explained above cnt and num will receive values one by one along with index.
    for cnt, num in enumerate (nums):
        
        # We look if the number required to be added into the 'num' is present in dictionary
        if target-num in lookup:
            # if value found in lookup then we return the current index along with the index of number found in lookup.
            return lookup[target-num], cnt

        # After every loop insert the current value and its index into the lookup dictionary.
        lookup[num]=cnt
  

Надеюсь, я ответил на ваш запрос так, как вы хотели. Пожалуйста, прокомментируйте ниже, если что-то осталось без ответа, я обязательно постараюсь ответить и на это.