2016-06-23 2 views
1

키가 꼭지점을 나타내고 다음 목록이 꼭지점에있는 가장자리를 나타냅니다 (첫 번째 숫자 가중치와 두 번째 숫자 인접 꼭지점). 가중치 그래프를 사전으로 나타냅니다.값없이 사전에서 키 저장

wGraph = { 1 : [[2, 2],[3, 4],[3, 3]], 
     3 : [[3, 2],[5, 4],[7, 5]], 
     2 : [[2, 1],[4, 4],[3, 6]], 
     4 : [[3, 1],[4, 2],[1, 6],[5, 3]], 
     6 : [[3, 2],[1, 4],[8, 5]], 
     5 : [[7, 3],[8, 6],[9, 7]], 
     7 : [9, 5]} 

사전의 값이없는 임의의 키를 visited라는 목록에 저장하고 싶습니다.

random_num = random.randrange(len(wGraph)) 

visited = [] 

사전에서 임의 번호에 따라 키를 가져 오는 방법은 무엇입니까?

+2

키는 항상 숫자 1 ... 최대입니까? 그럼 대답은'randon_num + 1'이 될 것입니다. – RemcoGerlich

+0

그래, 나도 그 생각을하고 있었지만 키가 숫자 순서가 아니거나 키가 예를 들어 글자 일지라도 키가 발견 될 수있는 곳을 선호했다. – Leero11

답변

3

일부 값을 임의로 선택하려면 random.choice을 사용하십시오. 당신은 사전의 키에서 선택합니다, 그래서 당신이 전달 무엇인지 정확히 :

random.choice(wGraph.keys()) 
+0

이것이 비효율적이라는 것은 유감입니다. C 구조체를 직접 엉망으로 만들고 싶지 않으면 Python은 키 목록을 구체화하지 않고 임의의 키를 선택하는 방법을 제공하지 않습니다. – user2357112

+0

@ user2357112 python은 oss이므로 패치를 제출해주십시오. –

+0

@brunodesthuilliers : 파이썬의 디자인 철학에 맞는 기능을 디자인하는 좋은 방법은 없습니다. "임의의 키 가져 오기"기능을 제공하는 경우 무작위 샘플 그리기 (특히 거부 샘플링이 비효율적 인 대규모 샘플의 경우)와 같은 많은 사용 사례가 누락됩니다. 해시 테이블에 대한 직접 액세스를 제공하면 구현 세부 사항이 상당히 노출되며 작업하기에 다소 어색한 인터페이스입니다. 효율적인 무작위 키 선택을 제공하려는 시도는 다른 파이썬에서 사용할 수있는 디자인 결정을 제한합니다 ... – user2357112

0
import random 

visited = [] 

def random_key(): 
    wGraph = {1: [[2, 2], [3, 4], [3, 3]], 
       3: [[3, 2], [5, 4], [7, 5]], 
       2: [[2, 1], [4, 4], [3, 6]], 
       4: [[3, 1], [4, 2], [1, 6], [5, 3]], 
       6: [[3, 2], [1, 4], [8, 5]], 
       5: [[7, 3], [8, 6], [9, 7]], 
       7: [9, 5]} 

    random_key = random.choice(wGraph.keys()) 

    if random_key not in visited: 
     visited.append(random_key) 
    print visited 


for e in range(7): 
    random_key() 
3

대답은 세부 사항에 따라 달라집니다 - 당신이 어떻게 많은 키, 그들은 항상 숫자 1입니다. ..max, 이전에 방문한 키를 다시 방문 하시겠습니까, 그래프 노드가 시간이 지남에 따라 추가되었거나 계속 유지됩니까? 결국 모든 키 또는 일부분 만 방문하게됩니다.

하나의 아이디어 : 예를 들어, 귀하의 키가 항상 순차적으로 번호가 매겨진 경우 random_num + 1을 사용할 수 있습니다. 당신은 이미 그들이 DICK의 열쇠임을 알고 있으며 특별한 것을 만들 필요가 없습니다.

>>> keys_to_visit = wGraph.keys() 
>>> keys_to_visit.shuffle() 
>>> first_key_to_visit = keys_to_visit.pop() 

그리고 당신이 새로 필요할 때마다) (.pop 계속 전화 :

또 다른 옵션은 한 번만 키 목록을 랜덤 화하는 것입니다. 이는 노드를 다시보고 싶지 않고 노드 목록이 일정한 경우에만 작동합니다.

+0

셔플을 사용하려고 할 때 : TypeError : 'dict_keys'객체가 인덱싱을 지원하지 않습니다. – Leero11

+0

@ Leero11 : 죄송합니다. 저는 파이썬 2에도 익숙합니다. 파이썬 3에서는 키 반복자를 먼저 목록으로 변환해야합니다 ('keys_to_visit = list (wGraph.keys())'). – RemcoGerlich