字典键值互换丢失元素排查:节点邻居数统计异常
问题:键值互换时字典元素丢失的原因及解决办法
核心问题分析
你遇到的元素丢失不是代码bug,而是Python字典的基本特性导致的:字典的键必须是唯一的,重复的键会被后面的覆盖。
看你的流程:
- 边列表统计邻居数得到:
{0: 2, 4: 3, 1: 1, 2: 2, 3: 2} - 统计邻居数的出现次数得到
Counter({2: 3, 3: 1, 1: 1})——这里的键是邻居数,值是对应出现的节点数量 - 你试图执行
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
相关产品推荐
相关产品推荐

