我怎么能写得更好?没有Counter等库

时间:2015-12-06 19:57:21

标签: python arrays counter

您好我正在学习Python,我有一个问题要问你。我的脚本计算在数组中找到的数字0-9的次数,并以格式[[0,0],[1,0],[2,0] .....]保存数据。 ?如何在没有任何库的情况下更好地编写它?我想扩展Python知识的视野,提高自己的技能。

我的代码:

inp=input("Enter a sequence of numbers: ")
tab=[]
for i in range(0,10):
    counter=0
    for c in inp:
        if c == str(i):
            counter+=1
    tab.append([])
    tab[i].append(i)
    tab[i].append(counter)
print(tab)

示例输入

Enter a sequence of numbers: 111112222333445

输出

[[0, 0], [1, 5], [2, 4], [3, 3], [4, 2], [5, 1], [6, 0], [7, 0], [8, 0], [9, 0]]  

祝你好运

4 个答案:

答案 0 :(得分:2)

很高兴阅读

G

转换为循环中的inp = '111112222333445' numbers = [int(number) for number in inp] res = [[index, 0] for index in range(10)] for number in numbers: res[number][-1] += 1 print(res) [[0, 0], [1, 5], [2, 4], [3, 3], [4, 2], [5, 1], [6, 0], [7, 0], [8, 0], [9, 0]]

int

使用inp = '111112222333445' res = [[index, 0] for index in range(10)] for number in inp: res[int(number)][-1] += 1

map

答案 1 :(得分:0)

您也可以创建自己的Counter dict,使用常规字典进行计数:

inp = "111112222333445"

d = {}.fromkeys(range(10), 0)
for i in map(int, inp):
    d[i] += 1

print([[i, d[i]] for i in range(10)])
[[0, 0], [1, 5], [2, 4], [3, 3], [4, 2], [5, 1], [6, 0], [7, 0], [8, 0], [9, 0]]

如果订单不一定重要且您对元组没问题,只需致电list(d.items())

print(list(d.items()))

答案 2 :(得分:-1)

我不喜欢循环并尽可能避免使用它们。我没有实现将字符串解析为整数列表。所以,为了好玩,我掀起了一个仅依赖于map,filter和zip的解决方案:

>>> groupedByNumber = map(lambda n: filter(lambda m: m == n, [1,1,1,1,1,2,2,2,2,3,3,3,4,4,5]), range(1,10))
[[1, 1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3], [4, 4], [5], [], [], [], []]
>>> countWithNumber = zip(range(1,10), map(lambda n: len(n), groupedByNumber))
>>> countWithNumber
[(1, 5), (2, 4), (3, 3), (4, 2), (5, 1), (6, 0), (7, 0), (8, 0), (9, 0)]

只使用标准库。此外,没有可变性或在任何地方与索引杂耍。希望他们是元组而不是列表的事实是可以的:)

答案 3 :(得分:-1)

简单的方法是在模块集合中使用类CounterCounterdict,它存储某个项在列表中的时间或者给定的可迭代次数它

就是这样:

from collection import Counter 
inp=input("Enter a sequence of numbers: ") #str
cuenta = Counter(inp) #{char:int}
print(list(cuenta.items())) #[ (char,int) ] , items() give the contents of a dict in 
                            #tuples of the form (key,value) 

Counter(inp)您将inp视为char列表,​​您还可以使用filter删除inp中的无数字字符

filter(lambda x:x.isdigit(),inp)

然后更改cuenta

cuenta = Counter(filter(lambda x:x.isdigit(),inp))

但是如果您不想使用 Counterfilter,因为函数式编程风格对您来说仍然不熟悉,那么我不会使用列表,而是宁愿使用dict并将Counter为我做的工作编码为:

inp=input("Enter a sequence of numbers: ") #str
digit_count = dict( [ (n,0) for n in range(10) ] ) #inicialize this dict with the keys 
                                                   #that I care about and a value of zero, 
                                                   #meaning that a see none of them yet
for char in inp:          #here I treat inp like a list of char
    if char.isdigit() :   #I make sure that is a number
        digit_count[ int(char) ] += 1 
tab = list(digit_count.items())  
print( tab )

如果您确实需要tab列表,那么您可以这样做

tab = list( list(elem) for elem in digit_count.items() )

此外,您可以构建像这样的通用计数器函数

def counter(iterable)
    """Function that return a list of the form [(item,count)] where
       item are the elements of iterable and count is how many times
       is present in there"""
    counter = dict()
    for elem in iterable:
        if elem in counter:
            counter[elem] += 1
        else:
            counter[elem] = 1
    return list(counter.items()) #or just return the counter

这样做你可以在需要它的其他情况下重用这段代码而不必再次写它,因为所有的模块化和可重用性都是优秀程序员的标志