2016-09-30 2 views
0

저는 파이썬에 대해 매우 익숙하며 파이썬을 배우기 위해 최선을 다하고 있습니다. 나는 내가 발견 한 커뮤니티 탐지 알고리즘을 구현하려고 노력해 왔으며 여기서 누군가의 도움을 얻을 수 있다면 정말로 감사 할 것입니다.사전으로 정렬 된 튜플을 키로 추가하기

나는 defaultdict (목록)가은 아래와 같다 내 입력 :

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

, 'B', 'D'를, 'E' 등 나무에 노드를 나타냅니다. 사전의 개의 자식 노드을 나타내고 부모 노드를 나타냅니다. 그래서 위의 입력에서 'B'는 'D'의 자식이고 'D'는 'E'의 자식입니다.

과 같은 사전을 만들려고 시도합니다. (정렬 된 순서대로) 및 은 값이입니다. 예상 출력은 다음과 같습니다.

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']]*/ 

을 그리고 나는 내가 DICT이 목록에서 값을 가져옵니다 생각했다. 분명히 목록의 목록을 가지고 있으며 목록의 항목은 정렬되지 않았습니다. unhashable 유형 :

2)

edges = {} 

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

위를 실행에, 나는 형식 오류를 가지고 '목록'나는 몇 가지 다른 방법을 시도

,하지만 아무도 성공을 입증하지 않습니다. 누군가가 나를 어떻게 할 수 있는지 배우는 것을 도울 수 있다면 좋을 것입니다.

추신 : 내 "실패한"노력에 대한 증거를 게시했지만, 내 목표를 달성하기 위해 노력한 모든 어리석은 길을 지나가도록하여 시간을 낭비하고 싶습니다. 또한, 나는 내 질문에 대한 답변을 찾을 수 있다면 googled 및 시도. 무수한 솔루션이 있었지만, 나는 여전히 로직을 성공적으로 구현하지 못했습니다. 나는 정직하게 파이썬을 배우려고 노력하고 있으며 올바른 방향으로 나를 밀어 붙일 수 있다면 좋을 것입니다.

+0

'sorted'는 튜플을 건네 주더라도 항상 목록을 반환합니다. – user2357112

+2

참고 : 표시된 리터럴 중 어느 것도 사전이 아니며 모든 목록입니다. – AChampion

+0

예! 내 잘못입니다. 질문을 골랐던 방식은 오해의 소지가 있습니다. 오류에 대해 사과드립니다. –

답변

2

sorted returns a new sorted list 입력 유형에 관계없이당신은 결과가 분류 tuple 싶은 경우에, 다만 tuple 생성자에서 sorted 전화를 포장 : 파이썬

t = tuple(sorted(t)) 

은 유형 만 불변의 유형 (예를 들어 int, str, 또는 tuple들과 frozenset의 기능을 내장 다른 불변 유형 만 포함)는 dictset/frozenset의 값으로 키로 사용하기에 적합합니다. 따라서 tuple 유형을 유지하는 것이 중요합니다. list은 변경 가능하며 list과 같은 변경 가능한 객체가 dict에 추가 된 끈적한 상황을 피하기 위해 변경되었습니다 (갑자기 해시 및 동등 비교가 버킷에 연결된 위치와 일치하지 않음). dict 가정을 위반하면 변경 가능한 기본 제공 유형을 완전히 사용할 수 없습니다.

+0

와우 !! 매력과 같은 노력 !! 나는 그것을 시도하고 예상대로 출력을 얻었다. 네가 부탁 한 변화를 만들었 어. 정말 고맙습니다. –

+0

화려한 설명 !! –

관련 문제