2016-09-30 2 views
0

Я очень новичок в Python, и я стараюсь изучить Python. Я пытаюсь реализовать алгоритм обнаружения сообщества, с которым я столкнулся, и я был бы очень признателен, если бы я мог получить помощь от кого-либо здесь.Добавление сортированного кортежа в словарь в качестве ключа

У меня есть defaultdict (список), мой вход, который выглядит следующим образом:

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

Здесь 'B', 'D', 'E' и т.д. представляют узлы в дереве. Ключ в словаре представляет детей узлы и значение представляет собой parent узлы. Таким образом, в приведенном выше вводе «B» является дочерним элементом «D», «D» является дочерним элементом «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)] 

В приведенном выше выходе, ключ кортеж, который представляет край на входе. Для ex: ('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 типа: 'список'

Я попробовал несколько других способов, но ни один не оказался успешным. Было бы здорово, если бы кто-то помог мне узнать, как я могу это сделать.

PS: Я бы опубликовал доказательства более «неудачных» моих усилий, но я хочу тратить ваше время, заставляя вас пройти через все глупые способы, которые я пытался достичь своих целей. Кроме того, я googled и попытался, если бы мог найти ответ на мой вопрос. Хотя было множество возможных решений, я все еще не смог успешно реализовать логику. Я честно пытаюсь изучить Python, и было бы здорово, если бы вы могли подтолкнуть меня в правильном направлении.

+0

'sorted' всегда возвращает список, даже если вы передадите ему кортеж. – user2357112

+2

Примечание: ни один из литералов, которые вы указали, не является словарями, все они являются списками. – AChampion

+0

Да, мой плохой! То, как я сформулировал вопрос, вводит в заблуждение. Извинения за ошибку. –

ответ

2

sorted returns a new sorted list, независимо от типа ввода.Если вы хотите, чтобы результат отсортированный tuple, просто обернуть sorted вызов в tuple конструктору:

t = tuple(sorted(t)) 

Для Python встроенных типов, только неизменные типы (например int, str или tuple с и frozenset сек содержащие только другие неизменяемые типы) пригодны для использования в качестве ключей в dict и значениях в set/frozenset s, поэтому важно сохранить тип tuple; list является изменчивым, и чтобы избежать ситуации с липкой ситуацией, когда изменяемый объект, например list, добавляется к dict, затем изменяется (так что сравнение хэша и равенства для него не соответствует тому, где оно было показано в таблице), делая его незаменяемым и нарушая предположения dict, они полностью запрещают использование изменяемых встроенных типов.

+0

wow !! Работал как шарм !! Я попробовал, и я получил результат, как ожидалось. Сделал изменения, которые вы мне просили. Огромное спасибо. –

+0

Блестящее объяснение !! –