HackerRank Ransom Note challenge
Your loop has a potential complexity of R * M (R number of words in ransom, M number of words in magazine). Additionally you use remove in the inner loop which which does linear search in magazine.

The solution is to count occurences of words in both, magazine and ransom. this is done in a single sweep and of linear complexity R + M (dict get/set is average linear).

the moste dense and readable solution is

from collections import Counter

def ransom_note(magazine, ransom):
    ran = Counter(ransom)
    mag = Counter(magazine)
    return len(ran - mag) == 0


if you assume a very long magazine and a short ransom message you could go for an early break by counting the ransom first, then do a down count with magazine words. magazine could be a generator in that case reading from an arbitrary large file.

from collections import Counter

def ransom_note(magazine, ransom):
    ran = Counter(ransom)
    if not ran:
        return True # handle edge case
    for m in magazine:
        if m in ran:
            # we need this word
            if ran[m] &gt; 1:
                ran[m] -= 1
                # still need more of that one
            else:
                # the last usage of this word
                ran.pop(m)
                if len(ran) == 0:
                    # we found the last word of our ransom
                    return True
    return False