程序没有在python中使用集合模块

时间:2014-03-23 01:50:12

标签: python collections module using

返回前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)

我的问题是编写没有集合模块的代码

任何人都可以帮我解决这个问题。提前谢谢

1 个答案:

答案 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}

值得注意的是,您可以大大清理现有代码。