#45484: python 語法疑問


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 臺中市立惠文高級中學
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2025-05-10 17:41:09
b563. 3.魔法學校交換生問題 -- 102學年度桃竹苗區資訊學科能力競賽 | From: [123.192.228.253] | 發表日期 : 2025-03-08 18:49

我是已經 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)

 

根據提示的資訊,大意上是說我在遍歷字典過程中,修改了字典內的內容,但這不是我的本意

想問有可能是什麼原因讓這個過程修改字典內容的?

 

 
#45485: Re: python 語法疑問


leeguanhan0909@gmail.com (李冠翰)

學校 : 高雄市苓雅區復華高級中學國中部
編號 : 276558
來源 : [42.77.81.113]
最後登入時間 :
2025-05-06 07:12:40
b563. 3.魔法學校交換生問題 -- 102學年度桃竹苗區資訊學科能力競賽 | From: [218.166.11.174] | 發表日期 : 2025-03-08 20:35

我是已經 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新創一個鍵,導致大小更動。

 
#45486: Re: python 語法疑問


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 臺中市立惠文高級中學
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2025-05-10 17:41:09
b563. 3.魔法學校交換生問題 -- 102學年度桃竹苗區資訊學科能力競賽 | From: [123.192.228.253] | 發表日期 : 2025-03-08 20:56

我是已經 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()) 避免受影響

 

 
#45487: Re: python 語法疑問


leeguanhan0909@gmail.com (李冠翰)

學校 : 高雄市苓雅區復華高級中學國中部
編號 : 276558
來源 : [42.77.81.113]
最後登入時間 :
2025-05-06 07:12:40
b563. 3.魔法學校交換生問題 -- 102學年度桃竹苗區資訊學科能力競賽 | From: [218.166.11.174] | 發表日期 : 2025-03-08 21:03

我是已經 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也可以

 
ZeroJudge Forum