Продолжайте получать ошибку «я не определен», но отступ выглядит нормально - PullRequest
0 голосов
/ 02 сентября 2018
def twoSum(self, nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: List[int]
    """

    # sort the given array
    sorted_nums = sorted(self.nums)
    # take two indices i,j
    i = 0 #start
    j = len(sorted_nums)-1 #end

    s = sorted_nums[i]+sorted_nums[j] 

    while s != self.target:
        # move j to left if sum > target (to decrease sum) 
         if s > self.target:
            j-=1
         else:
            i+=1 # move i to right if sum < target (to increase sum)
    s = sorted_nums[i]+sorted_nums[j]
    # return corresponding indices of elements in original array
    x = self.nums.index(sorted_nums[i])
    # change value at x to avoid referring to same element twice
    self.nums[x] = -1
    y = self.nums.index(sorted_nums[j])
    return [y,x]

if __name__=='__main__':
    target = input('What is the target?')
    nums = [int(x) for x in input('Input list: x y z ...').split()]
    twoSum(self, nums, target)

Я подумал, может быть, проблема в том, что я не использовал self в определении программы. У меня все та же проблема. Пробовал две суммы (числа, цель) и ту же проблему.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Внутри функции twoSum использование self допустимо, поскольку это имя параметра функции. Это вводит в заблуждение , потому что обычно первый параметр с именем self означает, что вы пишете метод класса, а здесь нет. Но это законно .


Но на верхнем уровне нет ничего с именем self, поэтому, когда вы делаете это:

twoSum(self, nums, target)

… вы получите NameError.

И неясно, что бы вы хотели, чтобы произошло здесь. Единственные вещи, которые вы определили в любом месте, это переменные nums и target и функция twoSum. В любом месте нет значения, которое кажется подходящим первым аргументом для передачи twoSum.


На самом деле, вы, кажется, не пользуетесь self внутри функции.

Вы ссылаетесь на вещи с именами xelf.nums и self.target, что означает, что вы ожидали некоторый объект с атрибутами с именами nums и target, но вы не определили ни один класс, который имеет такие атрибуты (и есть ничего встроенного, что делает, конечно).

Между тем, у вас есть совершенно хорошие параметры с именами nums и target, которые почти наверняка вам действительно нужны здесь.


Также:

Я подумал, может быть, проблема в том, что я не использовал self в определении программы.

Нету; это не го; в Python вполне допустимо иметь переменную, параметр и т. д., которые вы никогда не используете. Обычно это плохая идея, и линтеры могут предупредить об этом, но это не приведет к ошибке.

Что еще более важно, ваша проблема является полной противоположностью этой ситуации: дело не в том, что вы определили self и не использовали его, а в том, что вы не определили self и попытались его использовать.

Пробовал две суммы (числа, цель) и ту же проблему.

Нет, у вас другая проблема. Важно прочитать сообщения об ошибках и понять, что они означают.

Когда Python говорит NameError: name 'self' is not defined, он говорит вам, как решить проблему. Либо вам нужно где-то определить self, либо не пытаться использовать self. Нет автоматического способа исправить это - возможно, вы сделали опечатку и определили slef вместо self; может быть, вы хотели вызвать переменную self, но назвали ее this; может быть, есть более глубокая путаница, как в этом случае, и у вас даже не было переменной, чтобы использовать в первую очередь. Но главная проблема всегда в том, что вы пытаетесь использовать то, что никогда не определяли.

Когда Python говорит TypeError: 'twoSum(num, targets)' missing 1 required positional argument: 'target', также говорит вам, как решить проблему. Вы пытались использовать функцию, которая требует три аргумента, и вы дали только два. Опять же, автоматического исправления не существует - возможно, вы забыли аргумент, или вы включили дополнительный параметр, которого не должно быть в определении функции, или вы забыли значение по умолчанию для одного из ваших параметров, или вы можете вызвали неправильную функцию и т. д. Но главная проблема всегда заключается в том, что вы передаете неправильное количество аргументов.


Итак, способ исправить вашу программу, скорее всего:

  • Удалите параметр self из определения twoSum.
  • Заменить каждые self.nums и self.target внутри тела функции на nums и target.
  • Удалить аргумент self из вызова функции.
0 голосов
/ 02 сентября 2018

Вы используете простую функцию, а не метод объекта. self для вас не нужно передавать. (self обычно содержит объект, которому принадлежит метод)

Вы, вероятно, также хотите использовать аргумент sorted(nums) вместо sorted(self.nums).

...