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