为什么一种方式比另一种更有效?

时间:2017-12-09 18:27:07

标签: python python-3.x data-structures

我正在尝试hackerrank,我遇到了一个问题,我试图用python3来解决。 问题是 "一名绑架者写了赎金票据,但担心这会被追溯到他身上。他找到了一本杂志,想要知道他是否可以从中删除整个单词,并用它们来创建一个无法追踪的赎金笔记复制品。他的笔记中的单词区分大小写,他必须使用杂志中的全部单词,这意味着他不能使用子串或连接来创建他需要的单词。

鉴于杂志中的文字和赎金中的文字,如果他能用杂志上的全文完全复制他的赎金笔记,请打印是;否则,打印编号"

我尝试使用以下方法,

def ransom_note(magazine, ransom):

# comparing based on the number of times word occurred in the list
for word in set(ransom):
    if ransom.count(word) > magazine.count(word):
        return False
return True    

这确实有效,我在20个测试用例中得到了18个。 但另外两个案例是超时,所以我必须得到最好的成本效益方式。 我试图将单词作为字典存储为单词,将单词作为键,将单词的计数作为值。仍然没有得到这两个案例,当我调查案例时,两个输入都有30000个单词,预期的输出是"是"。

我看到了讨论的页面,发现了一段代码让我了解了。

    from collections import Counter

def ransom_note(magazine, ransom):
    return not (Counter(ransom) - Counter(magazine))

有人可以解释为什么这比我的方法更有效吗? 在此先感谢:)

1 个答案:

答案 0 :(得分:0)

据我了解,在您第二次尝试此问题时,ransommagazine都是字典,所以理论上您的代码尽可能快。

Python Counter集合专门用于处理简单的整数计数,并经过优化,可以非常快速地执行常见操作。事实证明,查看一个列表中是否有足够的东西来满足来自另一个列表的请求是一种非常常见的操作。所以他们花时间优化Counter非常快速地执行该操作。