You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字典键值互换丢失元素排查:节点邻居数统计异常

问题:键值互换时字典元素丢失的原因及解决办法

核心问题分析

你遇到的元素丢失不是代码bug,而是Python字典的基本特性导致的:字典的键必须是唯一的,重复的键会被后面的覆盖。

看你的流程:

  1. 边列表统计邻居数得到:{0: 2, 4: 3, 1: 1, 2: 2, 3: 2}
  2. 统计邻居数的出现次数得到Counter({2: 3, 3: 1, 1: 1})——这里的键是邻居数,值是对应出现的节点数量
  3. 你试图执行dict((v, k) for k, v in count_occurances.items())互换键值,此时原键值对是(2,3)、(3,1)、(1,1),互换后变成(3,2)、(1,3)、(1,1)。由于字典键不能重复,第二个1会覆盖第一个,最终只保留{3:2, 1:1},这是完全正常的行为。

另外你预期的{3: 2, 1:3, 1: 1}本身就是无效的Python字典,不存在这样的结构,重复键在字典中不被允许。

正确的实现方式

如果你想记录「出现次数对应的所有邻居数」,应该用值为列表的字典来存储多个对应值,而不是试图用重复键。示例代码:

from collections import defaultdict, Counter

edges = [(0, 4), (1, 4), (2, 0), (3, 2), (4, 3)]

# 统计每个节点的邻居数
occurances = Counter()
for u, v in edges:
    occurances[u] += 1
    occurances[v] += 1

# 统计邻居数的出现次数
count_occurances = Counter(occurances.values())

# 键值互换:用列表存储同一个出现次数对应的所有邻居数
result = defaultdict(list)
for neighbor_count, node_num in count_occurances.items():
    result[node_num].append(neighbor_count)

# 转换为普通字典(可选)
result = dict(result)
print(result)  # 输出:{3: [2], 1: [3, 1]}

这个结果的含义是:

  • 有3个节点的邻居数是2
  • 有1个节点的邻居数是3,同时有1个节点的邻居数是1

完全符合你的数据统计需求,且符合Python数据结构的规则。

内容的提问来源于stack exchange,提问作者user20724838

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 06:47:10