以下是问题:
这是一个长度为M的数组,其数字范围为1 ... N,其中 N小于或等于20.我们要经历它并计算如何 很多时候会遇到每个号码。即这就像Vowel Count 任务,但我们需要维持多个计数器。一定要用 为他们分开数组,不要创建很多单独的变量, 每个柜台一个。
输入数据在第一行包含M和N.第二个(相当长) line将包含由空格分隔的M个数字。答案应该包含 正好N个值,用空格分隔。首先应该给予金额 1-s,秒 - 2-s的数量等等。
示例:
数据输入:10 3 3 2 1 2 3 1 1 1 1 3
回答:5 2 3
以下是此问题的代码:
# 10 3
# 3 2 1 2 3 1 1 1 1 3
# [1, 0, 0]
# expected: [5, 2, 3]
# Transfer the first line input into number lista:
rawone = input()
stringa = rawone.split()
lista = []
for el in stringa:
lista.append(int(el))
# check the function:
# print (lista)
# Transfer the second line input into number listb:
rawtwo = input()
stringb = rawtwo.split()
listb = []
for ele in stringb:
listb.append(int(ele))
# check the function:
# print (listb)
# initiate a few variables:
t = 0 # the current time
times = lista[1] # the total time
print (times)
d = 1 # detect key
n = 0 # the number of qualified candidate
out = [] # the list of output
elist = []
# method: while (t<times) --> for element in listo: if (el==d) --> n=n+1:
# THIS PART HAS SOME PROBLEMS!!!
while t < times:
n = 0 # reinitiate the n
for elem in listb: # ***WHY THIS FOR LOOP CAN ONLY BE EXCUTE ONCE AND NOT WORK ANY MORE???
if elem == d:
elist += [(elem)]
d = d + 1
out.append(len(elist))
print (elist)
t = t + 1
print (out)
所以我对公式部分有一些问题,这不是我所期望的。我检查了我的答案。我很困惑为什么它每回合只添加一个合格的元素。我怎样才能解决这个问题?感谢您的慷慨帮助!
所以问题已经解决了,我的最终代码如下:
# Transfer the first line input into number lista:
rawone = input()
stringa = rawone.split()
lista = []
for el in stringa:
lista.append(int(el))
# check the function:
# print (lista)
# Transfer the second line input into number listb:
rawtwo = input()
stringb = rawtwo.split()
listb = []
for ele in stringb:
listb.append(int(ele))
# check the function:
# print (listb)
# initiate a few variables:
t = 0 # the current time
times = lista[1] # the total time
# print (times)
d = 1 # detect key
n = 0 # the number of qualified candidate
out = [] # the list of output
elist = []
# method: while (t<times) --> for element in listo: if (el==d) --> n=n+1:
# THIS PART HAS SOME PROBLEMS!!!
while t < times:
n = 0 # reinitiate the n
for elem in listb: # ***WHY THIS FOR LOOP CAN ONLY BE EXCUTE ONCE AND NOT WORK ANY MORE???
if elem == d:
elist.append(elem)
d = d + 1
out.append(len(elist))
elist = [] # reinitiate elist
# print (elist)
t = t + 1
print(" ".join(str(x) for x in out))
答案 0 :(得分:2)
我知道你的作业可能不会计算,但无论如何:
from collections import Counter
N = 3
my_list = [3, 3, 2, 1, 2, 3, 1, 1, 1, 1, 3]
c = Counter(my_list)
print(" ".join(c[i+1] for i in range(N)))
答案 1 :(得分:1)
由于变量名称和额外变量较差,您的代码难以遵循。在继续编程时,请查看更好的编码示例。
您遇到的主要问题是在内循环中增加 d 。使用语句 d = d + 1 并将其缩进一级。这意味着每次通过外部 while 循环时,只增加一次。
更好的是,只需使用外环即可。既然你已经知道要执行多少次,那么在外面使用 for 循环:
for d in range(1, times+1):
n = 0 # reinitiate the n
for elem in listb: # ***WHY THIS FOR LOOP CAN ONLY BE EXCUTE ONCE AND NOT WORK ANY MORE???
if elem == d:
elist += [elem]
out.append(len(elist))
print (elist)
print (out)
这至少可以让你输出更接近你想要的东西:
[1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 2, 2]
[1, 1, 1, 1, 1, 2, 2, 3, 3, 3]
[5, 7, 10]
您现在可以攻击下一个问题:仅计算该特定数字的条目,而不是到目前为止找到的所有数字。要做到这一点,请务必每次清除 elist ,而不是仅清理一次:
for d in range(1, times+1):
elist = []
for elem in listb:
...
...最终获得输出:
[1, 1, 1, 1, 1]
[2, 2]
[3, 3, 3]
[5, 2, 3]
我希望你能从这里完成。
另请注意,您只需将 out 设置为您找到的元素的直接计数。如果找到1,则增加 out 的第一个元素;如果找到2,则递增第二个,依此类推。该段的代码没有外部循环;它看起来像这样:
out = [0] * times
for elem in listb:
out[elem-1] += 1
print (out)
替换打印(次)下的所有代码。
答案 2 :(得分:0)
@Prune向您展示如何修复代码。我还想向您展示如何用更少的代码解决这个问题(使用列表而不是诉诸collections.Counter
)
由于您获得了M和N,因此最好将它们存储在名称
的变量中first_line = [int(x) for x in input().split()]
M, N = first_line
second_line = [int(x) for x in input().split()]
现在创建一个带有N个零的列表(数组)。这些是计数器
result = [0] * N
请记住,列表(数组)索引从0开始,因此我们需要从每个1
elem
for elem in second_line:
result[elem - 1] += 1
显示结果
print(result)