Q1:
Может кто-нибудь объяснить мне, почему первый один эквивалентно второй?
A1:
Мы можем использовать эту функцию и наблюдать кое-что:
>>> a = [1,2,3]
>>> b = [4,0,5]
>>>
>>> print merge(a,b)
[4, 1, 2, 3, 0, 5]
>>> a
[]
>>> b
[]
max(nums1, nums2).pop(0)
должен сравнить первые элементы обоих списков. Всякий раз, когда он выполняет одно время цикла, он выдает первый элемент максимального списка. Фактически, max
возвращает объект, используя ссылку на память, поэтому оба списка будут постепенно уменьшать свои элементы utils, заканчивающиеся for-loop. Поэтому поэтому a
и b
переменные пусты после завершения функции.
Позвольте мне показать, как работать.
>>> a = [1,2,3]
>>> b = [4,0,5]
>>> merge1(a,b)
Step1
nums1: [1, 2, 3]
nums2: [4, 0, 5]
The max list is [4, 0, 5]
So it will pop : 4
Step2
nums1: [1, 2, 3]
nums2: [0, 5]
The max list is [1, 2, 3]
So it will pop : 1
Step3
nums1: [2, 3]
nums2: [0, 5]
The max list is [2, 3]
So it will pop : 2
Step4
nums1: [3]
nums2: [0, 5]
The max list is [3]
So it will pop : 3
Step5
nums1: []
nums2: [0, 5]
The max list is [0, 5]
So it will pop : 0
Step6
nums1: []
nums2: [5]
The max list is [5]
So it will pop : 5
[4, 1, 2, 3, 0, 5]
И я прилагаю мой код:
def merge1(nums1, nums2):
list_ = []
count = 1
for _ in nums1 + nums2:
print 'Step%s' % count
print 'nums1: ' , nums1
print 'nums2: ' , nums2
print 'The max list is ', max(nums1, nums2)
print 'So it will pop :', max(nums1, nums2)[0]
list_.append(max(nums1, nums2).pop(0))
count +=1
return list_
В соответствии с рабочим процессом, вы увидите max(nums1, nums2).pop(0)
эквивалентно ans += nums1[0];nums1 = nums1[1:];
или ans += nums2[0];nums2 = nums1[1:];
.
Q2:
для _ в nums1 + nums2 выполнить LEN (nums1) + Len (nums2) раз, но если мы поп, длина должна изменилась.
А2:
Нет, после для цикла считывает номер или объект, как выполнение подсчета, то pop
не может динамически влиять на выполняющийся подсчете.
Я могу предложить эквивалентный код для вас.
def merge1(nums1, nums2):
return [max(nums1, nums2).pop(0) for _ in range(len(nums1) + len(nums2)]
демо:
>>> a = [1,2,3]
>>> b = [4,0,5]
>>> print merge1(a,b)
[4, 1, 2, 3, 0, 5]
Так это случилось? Ничего.
Q3:
В частности, часть: для _ в nums1 + nums2
A3:
По моим A2, вы можете изображения его for _ in range(len(nums1) + len(nums2)
, они эквивалентны. Цикл for-loop просто хочет, чтобы число элементов выполнялось как счетчик.
Вы объяснили код. Есть только что-то, что вы пропустили. 'num1 + num2' оценивается только один раз в начале. Это приводит к появлению нового анонимного списка, который цикл повторяется. Изменения одной из двух переменных в цикле больше не влияют на цикл. –
Этот код не только обфускается, но и не эффективно выполняет свою функцию. 'pop (0)' требует, чтобы весь список был смещен в памяти, что делает этот O (n * n) –