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]

注意:我不能为此使用集合。

4

3 回答 3

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))
于 2013-10-30T21:57:26.227 回答
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
>>>

正如 Peter DeGlopper 在下面的评论中指出的那样,此解决方案适用于任何字符集,而不仅仅是数字。但是,如果您希望它仅适用于数字,您需要做的就是对 for-loop 行稍作修改:

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

添加if c.isdigit()到末尾将使其仅捕获数字。

于 2013-10-30T22:01:50.790 回答
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))
于 2013-10-30T22:18:15.373 回答