<p>我想你的老师希望你自己写一个scratch算法。然而,知道如何使用标准库的模块是一项非常有用的技能。下面是一个使用<strong><a href="https://docs.python.org/3/library/collections.html#collections.Counter" rel="nofollow noreferrer">^{<cd1>}</a></strong>的解决方案,它是<code>dict</code>的一个子类</p>
<h2>代码</h2>
<pre class="lang-py prettyprint-override"><code>import collections
def validate_soup(msg, soup):
msg_preprocessed = ''.join(msg.lower().split())
soup_preprocessed = ''.join(soup.lower().split())
msg_count = collections.Counter(msg_preprocessed)
soup_count = collections.Counter(soup_preprocessed)
return all(n <= soup_count[k] for k,n in msg_count.items())
</code></pre>
<h2>测验</h2>
<pre class="lang-py prettyprint-override"><code>>>> validate_soup('Hello World', 'loollhed')
False
>>> validate_soup('Hello World', 'loollhedw')
False
>>> validate_soup('Hello World', 'loolhedwr')
False
>>> validate_soup('Hello World', 'loollhedwr')
True
>>> validate_soup('Hello World', 'abcloollhedwrdef')
True
</code></pre>
<h2>解释</h2>
<h3>首先,处理步骤。</h3>
<ul>
<li><code>.lower()</code>将消息放在小写字母中,因此<code>'Hello World'</code>和<code>hello world</code>是等价的,<a href="https://docs.python.org/3/library/stdtypes.html#str.lower" rel="nofollow noreferrer">see the documentation</a></李>
<li><code>''.join(s.split())</code>删除字符串<code>s</code>,<a href="https://stackoverflow.com/questions/8270092/remove-all-whitespace-in-a-string">see this question</a>中的所有空白</李>
<li>另见该问题:<a href="https://stackoverflow.com/questions/22520932/python-remove-all-non-alphabet-chars-from-string">Python: remove all non-alphabet chars from string?</a></李>
</ul>
<h3>然后,计数器:</h3>
<ul>
<li><code>collections.Counter(seq)</code>生成一个字典,将<code>seq</code>的元素映射到它们的出现次数,例如<code>Counter('helloworld') == {'l': 3, 'o': 2, 'h': 1, 'e': 1, 'w': 1, 'r': 1, 'd': 1}</code></李>
<li><code>all()</code>是一个内置函数,用于检查谓词对于序列的所有元素是否为真,<a href="https://docs.python.org/3/library/functions.html#all" rel="nofollow noreferrer">see the doc</a></李>
<li><code>all(n <= soup_count[k] for k,n in msg_count.items())</code>检查消息中出现的每个字符<code>n</code>的计数<code>k</code>是否低于(或等于)soup中字符<code>k</code>的计数</李>
</ul>