Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算字符串中每个数字出现次数的函数的正确输出_Python_Counting - Fatal编程技术网

Python 计算字符串中每个数字出现次数的函数的正确输出

Python 计算字符串中每个数字出现次数的函数的正确输出,python,counting,Python,Counting,如果用户输入一串数字,比如说。。。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) r

如果用户输入一串数字,比如说。。。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]


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

您非常接近一个工作解决方案,但是删除所有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))

您非常接近于一个可行的解决方案,但是删除所有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))

如果没有
集合。计数器
,下面是一个非常简短而有效的解决方案:

>>> 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循环行:

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

如果在末尾添加
if c.isdigit()
,则只会捕获数字。

不包含
集合。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循环行:

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

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

一种不使用计数器的方法:

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))

不使用计数器的方法:

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))

计数器很好,但是OP特别说“我不能用集合来做这个。”是的,我刚刚看到了。修正了。它的优点是可以处理任何字母表,而不仅仅是数字。而且,如果输入字符串很长,速度会快得多。我很惊讶这么多。在我的桌面上,在一百万个元素的输入字符串上重复1000次需要107秒,而基于列表的实现需要1412秒。内置方法甚至可以通过自定义实现战胜单个遍历。计数器很棒,但OP明确表示“我不能使用集合来完成此任务。”是的,我刚刚看到了这一点。修正了。它的优点是可以处理任何字母表,而不仅仅是数字。而且,如果输入字符串很长,速度会快得多。我很惊讶这么多。在我的桌面上,在一百万个元素的输入字符串上重复1000次需要107秒,而基于列表的实现需要1412秒。内置方法甚至可以通过自定义实现战胜单个遍历。更简洁的表达式是
d[i]=d.get(i,0)+1
。更简洁的表达式是
d[i]=d.get(i,0)+1