我是已經 AC 這題了,但在 AC 這題前,我送出的某一個版本出現意料之外的錯誤,想詢問為什麼會出現這種狀況呢?
錯誤資訊:
您的程式被監控系統中斷,可能是程式無法正常結束所導致。 Traceback (most recent call last): File "/15614466_b563/code_15614466.py", line 16, in result = sum(data[i][j] * (i in data[j]) for i in data for j in data[i]) // 2 File "/15614466_b563/code_15614466.py", line 16, in result = sum(data[i][j] * (i in data[j]) for i in data for j in data[i]) // 2 RuntimeError: dictionary changed size during iteration |
我送出的程式碼(這送出去會吃RE):
from collections import defaultdict |
根據提示的資訊,大意上是說我在遍歷字典過程中,修改了字典內的內容,但這不是我的本意
想問有可能是什麼原因讓這個過程修改字典內容的?
我是已經 AC 這題了,但在 AC 這題前,我送出的某一個版本出現意料之外的錯誤,想詢問為什麼會出現這種狀況呢?
錯誤資訊:
您的程式被監控系統中斷,可能是程式無法正常結束所導致。 Traceback (most recent call last): File "/15614466_b563/code_15614466.py", line 16, in result = sum(data[i][j] * (i in data[j]) for i in data for j in data[i]) // 2 File "/15614466_b563/code_15614466.py", line 16, in result = sum(data[i][j] * (i in data[j]) for i in data for j in data[i]) // 2 RuntimeError: dictionary changed size during iteration
我送出的程式碼(這送出去會吃RE):
from collections import defaultdict
# data: dict[str, dict[str, int]]
while True:
try:
n = int(input())
except EOFError:
break
data = defaultdict(dict) # {原始學校: {目標學校: 人數}}
for _ in range(n):
a, b = input().strip().split()
data[a][b] = data[a].get(b, 0) + 1
result = sum(data[i][j] * (i in data[j]) for i in data for j in data[i]) // 2
print(result)
根據提示的資訊,大意上是說我在遍歷字典過程中,修改了字典內的內容,但這不是我的本意
想問有可能是什麼原因讓這個過程修改字典內容的?
在 i in data[j],如果j不存在data裡,defaultdict會自動為j新創一個鍵,導致大小更動。
我是已經 AC 這題了,但在 AC 這題前,我送出的某一個版本出現意料之外的錯誤,想詢問為什麼會出現這種狀況呢?
錯誤資訊:
您的程式被監控系統中斷,可能是程式無法正常結束所導致。 Traceback (most recent call last): File "/15614466_b563/code_15614466.py", line 16, in result = sum(data[i][j] * (i in data[j]) for i in data for j in data[i]) // 2 File "/15614466_b563/code_15614466.py", line 16, in result = sum(data[i][j] * (i in data[j]) for i in data for j in data[i]) // 2 RuntimeError: dictionary changed size during iteration
我送出的程式碼(這送出去會吃RE):
from collections import defaultdict
# data: dict[str, dict[str, int]]
while True:
try:
n = int(input())
except EOFError:
break
data = defaultdict(dict) # {原始學校: {目標學校: 人數}}
for _ in range(n):
a, b = input().strip().split()
data[a][b] = data[a].get(b, 0) + 1
result = sum(data[i][j] * (i in data[j]) for i in data for j in data[i]) // 2
print(result)
根據提示的資訊,大意上是說我在遍歷字典過程中,修改了字典內的內容,但這不是我的本意
想問有可能是什麼原因讓這個過程修改字典內容的?
在 i in data[j],如果j不存在data裡,defaultdict會自動為j新創一個鍵,導致大小更動。
原來是這樣,看來還是得囉嗦點, get 不能隨便省,或是改遍歷 tuple(data.keys()) 避免受影響
我是已經 AC 這題了,但在 AC 這題前,我送出的某一個版本出現意料之外的錯誤,想詢問為什麼會出現這種狀況呢?
錯誤資訊:
您的程式被監控系統中斷,可能是程式無法正常結束所導致。 Traceback (most recent call last): File "/15614466_b563/code_15614466.py", line 16, in result = sum(data[i][j] * (i in data[j]) for i in data for j in data[i]) // 2 File "/15614466_b563/code_15614466.py", line 16, in result = sum(data[i][j] * (i in data[j]) for i in data for j in data[i]) // 2 RuntimeError: dictionary changed size during iteration
我送出的程式碼(這送出去會吃RE):
from collections import defaultdict
# data: dict[str, dict[str, int]]
while True:
try:
n = int(input())
except EOFError:
break
data = defaultdict(dict) # {原始學校: {目標學校: 人數}}
for _ in range(n):
a, b = input().strip().split()
data[a][b] = data[a].get(b, 0) + 1
result = sum(data[i][j] * (i in data[j]) for i in data for j in data[i]) // 2
print(result)
根據提示的資訊,大意上是說我在遍歷字典過程中,修改了字典內的內容,但這不是我的本意
想問有可能是什麼原因讓這個過程修改字典內容的?
在 i in data[j],如果j不存在data裡,defaultdict會自動為j新創一個鍵,導致大小更動。
原來是這樣,看來還是得囉嗦點, get 不能隨便省,或是改遍歷 tuple(data.keys()) 避免受影響
其實在for-loop後面加上if判斷j in data也可以