Как ускорить этот код? Python

Рейтинг: 1Ответов: 1Опубликовано: 17.01.2023

Есть такой код:

s1 = 'dfgwjkgofdgrghdflsdgdfd'
s2 = 'world'

w = []
for x in s2:
    if x in s1:
        w.append(x)
        s1 = s1.replace(x, '', 1)

print(True if ''.join(w) == s2 else False)

Он проверяет можно ли из букв первого слова собрать второе слово. При этом учитывает количество букв. Например, в данном случае выдаст True. А если s2 заменить на woorld, то выдаст False, так как в s1 всего одна буква o.

Он работает, но CodeWars его не принимает, так как выполнение слишком долгое для огромных строк. Я предполагаю, что можно использовать count вместо replace, но не совсем понимаю логику как это реализовать. А может это возможно с помощью iter, next... В общем, вопрос - как ускорить этот код или написать аналогичный, но более быстрый?

Ответы

▲ 4Принят

collections.Counter:

from collections import Counter


s1 = 'dfgwjkgofdgrghdflsdgdfd'
s2 = 'world'

print(Counter(s1) >= Counter(s2))

Для Питона до версии 3.10 код придётся изменить:

c1 = Counter(s1)
c2 = Counter(s2)
print(all(c1[k] >= v for k, v in c2.items()))