将排序后的元组作为键添加到字典中

Adding a sorted tuple to a dictionary as a key

我是 Python 的新手,我正在努力学习 Python。我一直在尝试实施我遇到的社区检测算法,如果我能从这里的任何人那里得到帮助,我将不胜感激。

我有一个 defaultdict(list),我的输入看起来像:

input = [('B', ['D']), ('D', ['E']), ('F', ['E']), ('G', ['D', 'F'])]

这里,'B'、'D'、'E'等代表树中的节点。字典中的key表示children节点,value表示parent 个节点。所以在上面的输入中,'B'是'D'的child,'D'是'E'的child等

我正在尝试用 tuples(按排序顺序)创建一个字典作为 keysint 作为 。预期输出为:

output = [(('A', 'B'), 1.0), (('B', 'C'), 1.0), (('B', 'D'), 3.0), (('D', 'E'), 4.5), (('D', 'G'), 0.5), (('E', 'F'), 1.5), (('F', 'G'), 0.5)]

在上面的输出中,键是一个元组,表示输入中的一条边。例如: ('A' , 'B') 表示 A 和 B 之间的边,int 值是我计算的值。

我很想知道如何做到这一点。

我试过以下方法:

1)

edges = []
for node,parents in input.items():
    for p in sorted(parents):
        tup = (node,p)
        tup = sorted(tup)
        edges.append(tup)
/*output of the above line: [['E', 'F'], ['D', 'E'], ['A', 'B'], ['B', 'C'], ['B', 'D'], ['D', 'G'], ['F', 'G']]*/

然后我想我会从这个列表中提取值到字典中。显然,我得到了一个 key 类型 List 的字典,而且列表中的项目没有排序。

2)

edges = {}

for node,parents in node2parents.items():
    for p in sorted(parents):
        t = (node,p)
        t = sorted(t)
        edges[t] = 0

在执行上面的代码时,我得到一个 TypeError: unhashable type: 'list'

我尝试了其他几种方法,但 none 被证明是成功的。如果有人可以帮助我学习如何做到这一点,那就太好了。

PS :我会发布更多 "failed" 我的努力的证据,但我不想让你经历我一直试图完成的所有愚蠢的方式来浪费你的时间我的目标。另外,我用谷歌搜索并尝试是否能找到问题的答案。尽管有无数种可能的解决方案,但我仍然未能成功实现逻辑。老实说,我正在努力学习 Python,如果你能把我推向正确的方向,那就太好了。

sorted returns a new sorted list,无论输入的类型如何。如果您希望结果是排序的 tuple,只需将 sorted 调用包装在 tuple 构造函数中:

t = tuple(sorted(t))

对于 Python 内置类型,仅不可变类型(例如 intstrtuplefrozenset 仅包含其他类型不可变类型)适合用作 dict 中的键和 set/frozenset 中的值,这就是为什么保留 tuple 类型很重要; list 是可变的,并且为了避免像 list 这样的可变对象被添加到 dict,然后改变的粘性情况(所以突然间它的散列和相等比较不对应于它被存储的位置),使其无法找到并违反了 dict 假设,他们完全禁止使用可变的内置类型。