返回前n个最常出现的字符及其各自的计数
例如aaaaaabbbbcccc,2应该返回[(a 5)(b 4)]
如果是平局,则返回字母排序中较早出现的字符
e.g。 cdbba,2 - > [(b,2)(a,1)]
这是关于这个概念的代码:
def top_chars(word, n):
import collections
result=collections.Counter(word)
key=result.keys()
value=result.values()
for i in range(len(key)):
for j in range(len(key)):
if value[i]>value[j]:
t=key[j]
key[j]=key[i]
key[i]=t
v=value[j]
value[j]=value[i]
value[i]=v
for i in range(len(key)):
for j in range(len(key)):
if value[i]==value[j]:
if key[i] < key[j]:
t=key[j]
key[j]=key[i]
key[i]=t
k=zip(key,value)
return k[0:n]
pass
,测试案例是:
assert [('p', 2)] == top_chars("app",1)
assert [('p', 2), ('a',1)] == top_chars("app",2)
assert [('p', 2), ('a',1)] == top_chars("app",3)
assert [('a', 2)] == top_chars("aabc", 1)
assert [('a', 2), ('b', 1)] == top_chars("aabc", 2)
assert [('a', 2), ('b', 1), ('c', 1)] == top_chars("aabc", 3)
我的问题是编写没有集合模块的代码
任何人都可以帮我解决这个问题。提前谢谢
答案 0 :(得分:0)
到目前为止你尝试了什么?
您需要将元素映射到频率。映射通常需要一个映射,或者Python中所谓的字典({}
或dict
)。因此,只需计算列表中的每个元素(或者,在本例中为字符串)。
def counter(xs):
freqs = {}
for x in xs:
if x in freqs:
freqs[x] += 1
else:
freqs[x] = 1
return freqs
然后,例如,counter("aaaacccbbdd") == {'a': 4, 'c': 3, 'b': 2, 'd': 2}
值得注意的是,您可以大大清理现有代码。