![](/img/trans.png)
[英]python convert string representation of nested list of integers to nested list of integers
[英]Python nested loop miscounting instances of integers in list
我将头撞在墙上,试图弄清楚为什么这个嵌套循环错误地计算了列表中出现整数的次数。 我设置了一个函数以接受两行输入, n
和ar
,其中n
是ar
中整数的数量,而ar
是整数列表。 我的代码如下:
import sys
n = sys.stdin.readline()
n = int(n)
ar = sys.stdin.readline()
ar = ar.split(' ')
ar = [int(i) for i in ar]
def find_mode(n,ar):
# create an empty dict and initially set count of all integers to 1
d = {}
for i in range(n):
d[ar[i]] = 1
for i in range(n):
# hold integer i constant and check subsequent integers against it
# increase count if match
x = ar[i]
for k in range(i+1,n):
if ar[k] == x:
d[ar[k]] += 1
print(d)
计数器似乎每次都会将计数增加1,这使我相信嵌套循环存在问题。
>>> 9
>>> 1 2 3 4 4 9 9 0 0
{0: 2, 1: 1, 2: 1, 3: 1, 4: 2, 9: 2}
好
>>> 10
>>> 1 2 3 4 4 9 9 0 0 0
{0: 4, 1: 1, 2: 1, 3: 1, 4: 2, 9: 2}
0计数增加+2
>>> 11
>>> 1 2 3 4 4 9 9 0 0 0 0
{0: 7, 1: 1, 2: 1, 3: 1, 4: 2, 9: 2}
0计数增加+3
我知道可能会有更有效或“ pythonic”的方法来计算列表中数字的出现次数,但这是我想出的解决方案,而且当有人还在学习Python时,它将有助于理解为什么此精确解决方案是失败。 提前谢谢了。
这是因为对于列表中的每个不同数字(称为x
),您都要计算随后出现的次数。 如果一个数字只出现两次,这很好,但是如果它出现多次,那么您将为每个额外的出现计数过多。
例如: [0, 0, 0, 0]
。 您遍历列表,然后针对每个项目遍历该项目后面的列表。 因此,对于第一个0
您总共计了3
随后的0
s。 但是对于第二个,您将总计为2
,对于第三个您将总计为1
,即为6
。 这就是为什么最后3
太多的原因。
您可以使用collections.Counter
完成此任务:
>>> from collections import Counter
>>> d = Counter(ar)
我不确定我是否可以解决您的特定问题,但是像这样的事情会代替吗?
d={}
for x in ar:
d[x] = d.get(x, 0) + 1
我了解您想将现有工作作为学习练习进行修正,但是我不确定该方法是否正确。 确实,我无法真正说出您要做什么,因此我很难提供具体建议。 我建议您不要把好时光丢在后面。
python
有一种method
可以完全按照您的描述进行操作。
它称为.count()
。
如果执行ar.count(3)
,它将返回列表ar
出现3的次数。
**您的情况:**
不需要嵌套循环,因为您只需要一个循环。
尝试这个:
dic = {}
for num in ar:
if num not in dic:
dic[num] = 1
else:
dic[num] += 1
这将生成您想要的数字及其出现的dict
您可以参考其他答案,以了解如何更有效地解决此问题,但要回答您所提出的问题(为什么此嵌套循环不起作用?):
要可视化嵌套循环的工作,请考虑以下输入:
0 0 0 0 0
您的算法将计算以下内容:
0 0 0 0 0 ^ ^ ^ ^ ^
(5)
然后,
0 0 0 0 0 ^ ^ ^ ^
(4)
然后,
0 0 0 0 0 ^ ^ ^
(3)
然后,
0 0 0 0 0 ^ ^
(2)
最后,
0 0 0 0 0 ^
(1)
发生的事情是多次计数0的次数。 在这种情况下,
15
0's(5 + 4 + 3 + 2 + 1)
itertools是您的朋友
from itertools import groupby
def group_by_kv_l(n):
l = []
for k, v in groupby(n):
l.append((len(list(v)),int(k)))
return l
def group_by_kv_d(n):
d = {}
for k, v in groupby(n):
d[(int(k))] = len(list(v))
return d
if __name__ == "__main__":
n = input().split()
n = "".join(n)
print(
"STDIN: {}".format(n)
)
print(
group_by_kv_l(n)
)
print(
group_by_kv_d(n)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.