[英]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.