안녕하세요. 이번 시간에는 for in문에 대해서 알아보겠습니다.

 


 보통 ps를 하거나, 코테를 준비한다고 하면, 저는 3개만 잘 하라고 합니다. balanced tree, hash, array. 이 3개에서 거의 벗어나지 않기 때문이에요. 이 3개를 가지고 for in 문을 갖고 놀아보겠습니다.

 

 

 기본적으로 파이선은 bintree 계열이 없는 듯 하니, bintree 패키지를 깔아줍시다. 가상 환경에 깔아두면 유용하게 써먹을 수 있습니다. 이것은 rb 트리 뿐만이 아니라, AVL도 포함하고 있습니다.

 

 

 프로그램은 간단합니다. 30번 loop를 돌면서, tree에 (x,1) pair를 추가합니다. 그리고 8번째 줄에서 뭔가를 하는 듯 보입니다.

 

 

 출력 결과를 봅시다. 트리 안에 있는 (K, V)쌍을 출력했음을 알 수 있습니다. 이는 V가 1임을 보면 알 수 있습니다. 이는 Tree 내에 있는 원소 전체를 for in 구문으로 순회했다는 이야기도 됩니다. 여기서, rbTree는 iterable 했습니다. iterator가 아니였음을 유의하세요. 즉, in 구문 뒤에 리스트나 트리, dictionary와 같이 순회 가능한 구조를 써 주면, 끝까지 탐색을 하게 됩니다.

 

 STL로 치면, begin부터 end가 나올 때 까지 계속 순회한다고 보시면 되겠습니다.

 

 

 여담이지만, 이것 하나만 짚고 넘어갑시다. 잘 돌아갈까요? 30만번 추가하고, 30만번 찾는 연산을 합니다.

 

 

 1.08초면 생각보다 준수한 수치입니다. 심지어, 정방향, 역방향으로 추가해 줘도 잘 돌아감을 알 수 있습니다. bintree가 import 가능하다면 많이 쓰시는 것도 팁이 될 수 있겠네요.

 


 마찬가지로 생각해 본다면, dictionary도 순회 가능한 hash 구조이기에, for in 딕셔너리 이렇게 하시면, 전체를 순회하게 됩니다. 이것도 예제를 보여드리겠습니다.

 

 

 10개의 (K, V)쌍을 추가합니다.

 

 

 그리고, dic에 있는 아이템을 순회하면서 출력하겠습니다. 그러면 위와 같이 나오는데요. 여기서 뽑아지는 것은 Key 값들입니다. 당연하게도, K에 대응되는 V값은 dic[K]이므로, V값을 출력하려면 dic[K]를 출력하면 됩니다. 혹은 dic.get(K)를 하셔도 됩니다. 그런데, 잘 생각해 보면, 뭔가 더 좋은 방법이 있는 듯 해 보입니다. 왜냐하면, 제가 바로 위에서 말한 방법은 순회를 하면서, 키가 K인 것을 찾아야 하기 때문입니다.

 

 

 분명 저는 2번째 군청색, Key값이 3인 곳에 있는데, Key값이 3인 것의 Value를 얻어와야 합니다. 그냥 가리키는 것을 얻어오면 안 되나요? 이는 items() 메서드를 써서 구현할 수 있습니다.

 

 

 이것은 단지, dic을 돌면서 나오는 tuple을 리턴합니다. 그리고, 이것은 인덱스로 접근이 가능합니다. [0]은 키값, [1]은 벨류값을 의미합니다.

 

 

 적당히 잘 나오는군요.

 


 list에서도 잘 나올까요?

 

 리스트도 iterable하기 때문에 for in 문으로 순회를 할 수 있습니다.

 

 

 순회를 한 결과가 나왔음을 알 수 있습니다.