2013-10-30 49 views
0

我想要的代碼的輸出,如果用戶輸入像我們說的一串數字是這樣的事情... 122033正確的輸出功能,計數每個數字的出現在一個字符串

Enter string of numbers: 122033 
0 occurs 1 time 
1 occurs 1 time 
2 occurs 2 times 
3 occurs 2 times 


def count_digits(s): 
    res = [0]*10 
    for x in s: 
     res[int(x)] += 1 
    while 0 in res: 
     res.remove(0) 
    return res 

def main(): 
    s=input("Enter string of numbers: ") 

    print(count_digits(s)) 
main() 

這是我迄今爲止的程序。在當前狀態下,如果用戶輸入類似122033的輸出,則輸出爲: [1,1,2,2]

注意:我無法爲此使用集合。

回答

2

您非常接近工作解決方案,但刪除所有0計數條目會更改列表的索引。你已經需要編寫一些自定義美化打印的代碼,所以才留在0和跳躍元素,其中計數爲0。也許是這樣的:

def count_digits(s): 
    res = [0]*10 
    for x in s: 
     res[int(x)] += 1 
    return res 

def print_counts(counts): 
    for (index, count) in enumerate(counts): 
     if count == 1: 
      print("%d occurs %d time" % (index, count)) 
     elif count > 1: 
      print("%d occurs %d times" % (index, count)) 

def main(): 
    s=input("Enter string of numbers: ") 

    print_counts(count_digits(s)) 
2

沒有collections.Counter,這裏是一個很短,有效的解決方案:

>>> def count_digits(inp): 
...  for a,b in sorted((c, inp.count(c)) for c in set(inp)): 
...   print("{} occurs {} times".format(a, b)) 
... 
>>> mystr = input("Enter string of numbers: ") 
Enter string of numbers: 122033 
>>> count_digits(mystr) 
0 occurs 1 times 
1 occurs 1 times 
2 occurs 2 times 
3 occurs 2 times 
>>> 

正如彼得DeGlopper在下面的評論指出,這種解決方案適用於任何字符集工作,不只是數字。然而,如果你想讓它只有數字的工作,所有你需要做的是做一個小的修改for循環線:

for a,b in sorted((c, inp.count(c)) for c in set(inp) if c.isdigit()): 

添加if c.isdigit()到了年底會使其僅捕獲數字。

+0

計數器是偉大的,但OP明確表示:「我不能使用集合這一點。」 –

+0

是的,我剛剛看到。固定。 – iCodez

+0

這具有爲任何字母表工作的優勢,而不僅僅是數字。 –

0

不使用計數器的方法:

d = {} 

for i in somestring: 
    if i not in d: 
    d[i] = 1 
    else: 
    d[i] += 1 
for k,v in d.iteritems(): 
    print('{0} occurs {1} times'.format(k,v)) 
+0

更簡潔的表達式是'd [i] = d.get(i,0)+ 1'。 –

相關問題