您好我正在学习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]]
祝你好运
答案 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)
简单的方法是在模块集合中使用类Counter
,Counter
是dict
,它存储某个项在列表中的时间或者给定的可迭代次数它
就是这样:
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))
但是如果您不想使用 Counter
或filter
,因为函数式编程风格对您来说仍然不熟悉,那么我不会使用列表,而是宁愿使用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
这样做你可以在需要它的其他情况下重用这段代码而不必再次写它,因为所有的模块化和可重用性都是优秀程序员的标志