老师参与

‘字典相关编程题--统计句子中的词频次数’的疑问

周文扬 发表于2018年04月08日
<p><strong>老师,这个题目没有要求统计出某个词出现次数多少,只需要知道共有多少个词,感觉用列表更简洁?</strong></p><p>另外,‘原先的方式由于一边遍历一边remove可能会引起可迭代对象出问题’,这题答案15是错误的,应该是14?</p><p>是否,请老师解答。</p><p><strong><br ></strong></p><p><strong>用列表:</strong></p><p><code class="brush:python;toolbar:false" >def&nbsp;countfeq(s): &nbsp;&nbsp;&nbsp;&nbsp;s_list&nbsp;=&nbsp;s.split('/')&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;s_list_copy&nbsp;=&nbsp;s_list.copy() &nbsp;&nbsp;&nbsp;&nbsp;[s_list.remove(i)&nbsp;for&nbsp;i&nbsp;in&nbsp;s_list_copy&nbsp;if&nbsp;i&nbsp;in&nbsp;',。!&nbsp;”“,.!&quot;']&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;len(&nbsp;set(s_list)&nbsp;) if&nbsp;__name__&nbsp;==&nbsp;&quot;__main__&quot;: &nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;input()&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;s_dict&nbsp;=&nbsp;countfeq(s) &nbsp;&nbsp;&nbsp;print(countfeq(s))</code><strong>用字典:</strong></p><p><code class="brush:python;toolbar:false" >def&nbsp;countfeq(s): &nbsp;&nbsp;&nbsp;&nbsp;s_list&nbsp;=&nbsp;s.split('/')&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;s_list_copy&nbsp;=&nbsp;s_list.copy() &nbsp;&nbsp;&nbsp;&nbsp;[s_list.remove(i)&nbsp;for&nbsp;i&nbsp;in&nbsp;s_list_copy&nbsp;if&nbsp;i&nbsp;in&nbsp;',。!&nbsp;”“,.!&quot;'] &nbsp;&nbsp;&nbsp;&nbsp;a_list=list(set(s_list)) &nbsp;&nbsp;&nbsp;&nbsp;count=[s_list.count(i)&nbsp;for&nbsp;i&nbsp;in&nbsp;a_list] &nbsp;&nbsp;&nbsp;&nbsp;aDict=dict(zip(a_list,count)) &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;aDict if&nbsp;__name__&nbsp;==&nbsp;&quot;__main__&quot;: &nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;input()&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;s_dict&nbsp;=&nbsp;countfeq(s) &nbsp;&nbsp;&nbsp;print(len(s_dict.keys()))</code></p><p><strong><br ></strong></p><p><strong>题目:</strong></p><p>“</p><p>统计句子中的词频次数(3分)</p><p>题目内容:</p><p><br ></p><p>对于一个已分词的句子(可方便地扩展到统计文件中的词频):</p><p>我/是/一个/测试/句子/,/大家/赶快/来/统计/我/吧/,/大家/赶快/来/统计/我/吧/,/大家/赶快/来/统计/我/吧/,/重要/事情/说/三遍/!</p><p>可以用collections模块中的Counter()函数方便地统计词频,例如可用如下代码:</p><p><br ></p><p>import&nbsp;collections</p><p>s&nbsp;=&nbsp;&quot;我/是/一个/测试/句子/,/大家/赶快/来/统计/我/吧/,/大家/赶快/来/统计/我/吧/,/大家/赶快/来/统计/我/吧/,/重要/事情/说/三遍/!/&quot;</p><p>s_list&nbsp;=&nbsp;s.split('/')&nbsp;</p><p>[s_list.remove(item)&nbsp;for&nbsp;item&nbsp;in&nbsp;s_list&nbsp;if&nbsp;item&nbsp;in&nbsp;',。!”“']</p><p>collections.Counter(s_list)</p><p>这个问题也可以通过字典来解决,请编写用字典解决本问题的程序,为便于OJ系统自动判断,程序最后输出字符串中包含的不同词的个数。</p><p><br ></p><p>程序参考框架</p><p><br ></p><p>def&nbsp;countfeq(s):</p><p>&nbsp;&nbsp;&nbsp;...&nbsp;...</p><p>&nbsp;&nbsp;&nbsp;return&nbsp;a&nbsp;dict</p><p>if&nbsp;__name__&nbsp;==&nbsp;&quot;__main__&quot;:</p><p>&nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;input()</p><p>&nbsp;&nbsp;&nbsp;...&nbsp;...</p><p>&nbsp;&nbsp;&nbsp;s_dict&nbsp;=&nbsp;countfeq(s)</p><p>&nbsp;&nbsp;&nbsp;print(len(s_dict.keys()))</p><p><br ></p><p>输入格式:<br ></p><p>字符串</p><p><br ></p><p>输出格式:<br ></p><p>整数</p><p>”</p><p><br ></p><p><br ></p><p><br ></p>
3 回复

    1楼

  • 晚晚晚晚风 发表于2018年04月08日
    0 | 0 | 举报
    <p>赞同,如果只是为了统计共有多少个单词确实列表更合适,一个set就出来了,但是如果统计词频的话,这样变成字典就很方便。</p>
    晚晚晚晚风 发表于2018年04月08日
    添加评论
  • 2楼

  • 计算机_张莉 发表于2018年04月08日
    1 | 0 | 举报
    <p>问题提的很好,如果光统计词频总计的话确实只用列表就可以快速解决,但对于统计词频本身来说肯定是“词+词频”的方式有意义,因为本题是用OJ系统自动判分的,字典元素本身是无序的,所以简单起见改成了只要词频总计而不要词,但对大家的要求依然没有降低哈(•‾̑⌣‾̑•)</p><p>判断结果我用了另外的testdata。<br ></p>
    计算机_张莉 发表于2018年04月08日
    添加评论
  • 3楼

  • 周文扬 发表于2018年04月09日
    0 | 0 | 举报
    谢谢张莉老师解答。
    周文扬 发表于2018年04月09日
    添加评论