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

时间:2016-09-30 22:09:29

标签: python dictionary tuples defaultdict

我是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,如果你能把我推向正确的方向,那就太好了。

1 个答案:

答案 0 :(得分:2)

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

t = tuple(sorted(t))

对于Python内置类型,只有不可变类型(例如intstrtuplefrozenset仅包含其他不可变类型)适用于用作dict中的键和set / frozenset中的值,这就是保留tuple类型很重要的原因; list是可变的,并且为了避免像list这样的可变对象添加到dict的棘手情况,然后进行了更改(突然之间哈希和等式的比较不再是&#39} ; t对应于它被删除的位置),使其不可取并且违反dict假设,它们禁止完全使用可变内置类型。