我是Python的新手,我正在努力学习Python。我一直在尝试实现我遇到的社区检测算法,如果我能从这里得到任何人的帮助,我将非常感激。
我有一个 defaultdict(list),我的输入,如下所示:
input = [('B', ['D']), ('D', ['E']), ('F', ['E']), ('G', ['D', 'F'])]
此处,' B' D' D' E' 等代表树中的节点。字典中的键表示子节点,值表示父节点。所以在上面的输入中,' B'是一个D' D' D' D' D'是E' E'等
我正在尝试使用元组(按排序顺序)创建一个字典为键, int 为值。预期的输出是:
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']]*/
然后我想我会把这个列表中的值拉到一个字典。显然,我得到了一个键类型列表的词典,而且列表中的项目没有排序。
2)
edges = {}
for node,parents in node2parents.items():
for p in sorted(parents):
t = (node,p)
t = sorted(t)
edges[t] = 0
执行上述操作后,我收到了 TypeError:unhashable类型:' list'
我尝试了其他一些方法,但没有一个证明是成功的。如果有人能帮助我学习如何做到这一点,那就太好了。
PS:我会发布更多"失败的证据"我的努力,但我想浪费你的时间让你经历所有愚蠢的方式,我一直在努力实现我的目标。另外,如果我能找到问题的答案,我用谷歌搜索并尝试。虽然有无数可能的解决方案,但我仍未能成功实现逻辑。老实说,我正在努力学习Python,如果你能把我推向正确的方向,那就太好了。答案 0 :(得分:2)
sorted
returns a new sorted list
,无论输入的类型如何。如果您希望结果是有序的tuple
,只需将sorted
调用包装在tuple
构造函数中:
t = tuple(sorted(t))
对于Python内置类型,只有不可变类型(例如int
,str
或tuple
和frozenset
仅包含其他不可变类型)适用于用作dict
中的键和set
/ frozenset
中的值,这就是保留tuple
类型很重要的原因; list
是可变的,并且为了避免像list
这样的可变对象添加到dict
的棘手情况,然后进行了更改(突然之间哈希和等式的比较不再是&#39} ; t对应于它被删除的位置),使其不可取并且违反dict
假设,它们禁止完全使用可变内置类型。