我们可以在python列表中两次添加相同的元素吗?

时间:2016-02-23 00:29:15

标签: python list

以下是问题:

  

这是一个长度为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))

3 个答案:

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