Я слежу за некоторыми онлайн-курсами, и у меня есть эта функция sort, но, кажется, ничего не выполняется после части print "here":

import unittest


def sort(meetings, indx):
    print("call function")
    print meetings
    firstfirst = meetings[indx][0]
    firstsecond = meetings[indx][1]
    secondfirst = meetings[indx+1][0]
    secondsecond = meetings[indx+1][1]

    first = meetings[indx]
    second = meetings[indx+1]

    print firstfirst
    print secondfirst

    if firstfirst > secondfirst:
        meetings[indx] = second
        meetings[indx+1] = first
    print "here"
    indx = index + 1
    print "meetings: "
    sort(meetings[indx:len(meetings)-1], indx)

def merge_ranges(meetings):

    # Merge meeting range

    sort(meetings, 0)

    return []


# Tests



class Test(unittest.TestCase):

    def test_meetings_overlap(self):
        actual = merge_ranges([(1, 3), (2, 4)])
        expected = [(1, 4)]
        self.assertEqual(actual, expected)

    def test_meetings_touch(self):
        actual = merge_ranges([(5, 6), (6, 8)])
        expected = [(5, 8)]
        self.assertEqual(actual, expected)

    def test_meeting_contains_other_meeting(self):
        actual = merge_ranges([(1, 8), (2, 5)])
        expected = [(1, 8)]
        self.assertEqual(actual, expected)

    def test_meetings_stay_separate(self):
        actual = merge_ranges([(1, 3), (4, 8)])
        expected = [(1, 3), (4, 8)]
        self.assertEqual(actual, expected)

    def test_multiple_merged_meetings(self):
        actual = merge_ranges([(1, 4), (2, 5), (5, 8)])
        expected = [(1, 8)]
        self.assertEqual(actual, expected)

    def test_meetings_not_sorted(self):
        actual = merge_ranges([(5, 8), (1, 4), (6, 8)])
        expected = [(1, 4), (5, 8)]
        self.assertEqual(actual, expected)

    def test_sample_input(self):
        actual = merge_ranges([(0, 1), (3, 5), (4, 8), (10, 12), (9, 10)])
        expected = [(0, 1), (3, 8), (9, 12)]
        self.assertEqual(actual, expected)


unittest.main(verbosity=2)

Выходные данные показывают это и только выдают ошибки для тестовых случаев (которые я не включил), так как они должны ожидаться ...

call function
[(1, 8), (2, 5)]
1
2
here
call function
[(5, 8), (1, 4), (6, 8)]
5
1
here
call function
[(1, 3), (2, 4)]
1
2
here
call function
[(1, 3), (4, 8)]
1
4
here
call function
[(5, 6), (6, 8)]
5
6
here
call function
[(1, 4), (2, 5), (5, 8)]
1
2
here
call function
[(0, 1), (3, 5), (4, 8), (10, 12), (9, 10)]
0
3
here
1
lightweight 4 Июн 2018 в 00:00

1 ответ

Лучший ответ

"но ничто, кажется, ничего не бежит после печати" здесь "часть"

Вы основываете это на том факте, что больше ничего не печатает? Если так, то это потому, что вам нужно распечатать переменные, которые вы изменяете. Кроме того, ни одна из ваших функций не возвращает ничего, над чем вы работали внутри функции, и, хотя sort мутирует переменную встреч, он не знает, когда прекратить вызывать себя, он просто в конечном итоге выдаст ошибку при попытке индексирования в пустой список, содержащий в переменной встреч. Даже использование печати сбивает с толку. Вы используете print("call function") вверху, затем print meetings, а затем смешиваете синтаксис печати Python 2 и 3.

Но давайте рассмотрим суть вашей проблемы здесь.

def sort(meetings, indx):
    print("call function")
    print meetings
    # eventually meetings will be an empty list and meetings[indx] 
    # will throw an IndexError
    firstfirst = meetings[indx][0]
    firstsecond = meetings[indx][1]
    secondfirst = meetings[indx+1][0]
    secondsecond = meetings[indx+1][1]

    first = meetings[indx]
    second = meetings[indx+1]

    print firstfirst
    print secondfirst

    if firstfirst > secondfirst:
        meetings[indx] = second
        meetings[indx+1] = first
    # "here" is printed
    print "here"  
    # you alter the indx variable but do not print it
    indx = index + 1  
    # "meetings:" is printed but nothing else is printed below it
    print "meetings: "  
    # sort calls itself without any condition to stop calling itself 
    # and which will eventually have the indx variable exceed the 
    # meetings length in the call:
    #     meetings[indx:len(meetings)-1]
    sort(meetings[indx:len(meetings)-1], indx)  
    # nothing is returned here and sort does not mutate the object in 
    # any way that I could see that would cause sort to stop 
    # calling itself

def merge_ranges(meetings):

    # Merge meeting range

    sort(meetings, 0)

    return []  # <- this empty list is always returned no matter what
  • сортировка ничего не возвращает, что не является большой проблемой, если вы просто что-то мутируете
  • Сортировка вызывает себя рекурсивно, пока не превысит предел рекурсии, нет ничего, чтобы сказать ей прекратить вызывать себя

Предположим, что это список встреч

meetings = [(0, 1), (3, 5)]
meetings[5:] # ==> [] will always return an empty list when indx exceed meetings length

Это означает, что сортировка продолжает вызывать себя с пустым списком и большим индексом

  • merge_meetings всегда возвращает пустой список

Вам нужно проверить, что индекс больше чем len(meetings)

Предложение: Предположим, Python 3

def sort(meetings, indx):
    print("call function")
    print(meetings)
    first = meetings[indx]
    second = meetings[indx+1]
    firstfirst = first[0]
    firstsecond = first[1]
    secondfirst = second[0]
    secondsecond = second[1]

    print(firstfirst)
    print(secondfirst)

    if firstfirst > secondfirst:
        meetings[indx] = second
        meetings[indx+1] = first
    indx = index + 1
    print("meetings: ", meetings)
    if len(meetings) - 1 > indx:
        sort(meetings[indx:], indx)

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

In [1]: a = [(5,3), (0,2), (4,1), (1,1)]
In [2]: sort(a, 0)
call function
[(0, 2), (5, 3), (4, 1), (1, 1)]
0
5
meetings:  [(0, 2), (5, 3), (4, 1), (1, 1)]
call function
[(5, 3), (4, 1), (1, 1)]
4
1
meetings:  [(5, 3), (1, 1), (4, 1)]

In [3]: a
Out[3]: [(0, 2), (5, 3), (4, 1), (1, 1)]

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

3
Verbal_Kint 3 Июн 2018 в 21:56