Это сравнение списка в Python не нужно?

Решение для подсчета и сравнения анаграмм, предоставленное на сайте http://interactivepython.org/, проверяет списки для окончательной проверки времени, если счет для каждого значения ASCII одинаков.

j = 0
stillOK = True
while j<26 and stillOK:
    if c1[j]==c2[j]:
        j = j + 1
    else:
        stillOK = False

return stillOK

Почему бы не использовать оператор сравнения?

return (c1 == c2)

Полный код:

def anagramSolution4(s1,s2):
    c1 = [0]*26
    c2 = [0]*26

    for i in range(len(s1)):
        pos = ord(s1[i])-ord('a')
        c1[pos] = c1[pos] + 1

    for i in range(len(s2)):
        pos = ord(s2[i])-ord('a')
        c2[pos] = c2[pos] + 1

    j = 0
    stillOK = True
    while j<26 and stillOK:
        if c1[j]==c2[j]:
            j = j + 1
        else:
            stillOK = False

    return stillOK

print(anagramSolution4('apple','pleap'))

Отредактировано, чтобы добавить:

Я проверил с:

anagramSolution4('abc','cba') #returns True
anagramSolution4('abc','cbd') #returns False
anagramSolution4('abc','cbah') #returns False

... они все проходят. Что будет подходящим тестом, чтобы показать, что c1==c2 терпит неудачу?

1 ответ

Решение

С помощью == В обоих списках результат будет одинаковым, но также будут скрыты некоторые детали реализации. Учитывая, что скрипт взят с веб-сайта, используемого для обучения, я думаю, что это для целей обучения.

Кроме того, я вижу, что на веб-странице вам задают несколько вопросов о сложностях. Ну, используя c1 == c2 вместо этого цикл, вероятно, ввел бы в заблуждение некоторых людей и заставил бы их думать, что операция - это O(1) вместо O (min (len (c1), len (c2)))[1].

Наконец, обратите внимание, что есть много языков, которые не имеют представления о списках.


[1] Это также не обязательно верно, так как два списка могут содержать элементы с пользовательскими и сложными __eq__() методы.

Другие вопросы по тегам