基于collections.Counter()的不同元素及其频率统计:如何用单个列表简化现有代码?
简化单词统计的实现方案
输入说明
第一行输入整数n,接下来n行每行输入一个单词。示例输入如下:
4 abc abcdef abcd abc
输出说明
输出两行内容,第一行输出输入中不同单词的数量,第二行按照单词在输入中首次出现的顺序输出每个不同单词的出现次数。示例输出如下:
3 2 1 1
现有代码
import collections n=int(input()) l=[] l1=[] for i in range(n): st=input() l1.append(st) if st not in l: l.append(st) frequency = collections.Counter(l1) d=dict(frequency) print(len(l)) for i in d.values(): print(i,end=" ")
问题
请问是否存在更简洁的实现方式,能够仅使用单个列表而非创建两个列表(l和l1)来完成该功能?
当然可以!咱们完全可以只维护一个记录单词首次出现顺序的列表,搭配一个字典来统计频率,这样就能砍掉多余的那个列表了。
优化后的代码
n = int(input()) order = [] freq = {} for _ in range(n): word = input().strip() if word not in freq: order.append(word) freq[word] = 0 freq[word] += 1 print(len(order)) print(' '.join(map(str, (freq[word] for word in order))))
代码说明
- 用
order列表专门保存单词第一次出现的顺序,只有当单词还没被统计过(不在freq字典里)时才添加进去,避免重复记录。 freq字典直接负责计数:每输入一个单词,就把对应键的值加1,不用先存所有输入再统计。- 最后输出时,按照
order里的顺序取出每个单词的频率,转成字符串后用空格连接,完美符合输出要求。
如果需要兼容Python 3.6及更早版本(这些版本的普通字典不保证插入顺序),可以改用collections.OrderedDict来替代普通字典,但在Python 3.7+里普通字典已经是插入有序的,所以上面的写法完全够用啦。
内容的提问来源于stack exchange,提问作者sam2611
相关产品推荐
相关产品推荐

