Post List

2015년 7월 31일 금요일

Python 기초 #09 Tuples

1. Tuple 이란 ?

Tuple 은 List 처럼 여러가지 Value를 담는 Collection이지만,
불변(immutable)한 특징을 가집니다.
또한 비교 가능(comparable)하므로 List에 넣어서 Sort가 가능하며
해쉬 가능(hashable)하므로 Dictionary에 넣어서 Key 값으로 사용할 수 있습니다.
튜플 선언시 각각의 Value를 콤마( , ) 로 구분하여 대입하면 되는데
양 끝에 괄호는 안써줘도 되지만, 가독성을 위해서 보통 적어 줍니다.
1개짜리 Tuple을 생성 할떄는 마지막에 콤마를 적어주면 됩니다.
내장함수 tuple( ) 를 이용하여 인자로 String 이나 List 등을 넣어주면 그 요소들을 Tuple로 생성해줍니다.
Tuple에서도 [ : ] 연산을 이용하여 Value 들의 subset 추출이 가능합니다만,
Tuple 내부의 값을 변경하는 것은 되지 않습니다.
Tuple 자체를 다른 Tuple로 교체는 가능합니다.

>>> T = 'L','U','N','A'
>>> T = (1, 2, 3, 4)
>>> T = 'Luna',
>>> type(T)
<type 'tuple'>
>>> T = ('Luna')
>>> type(T)
<type 'str'>
>>> L = [ 'Luna','Star' ]
>>> T = tuple(L)
>>> print T
('Luna', 'Star')
>>> T = tuple('Luna the Star')
>>> print T
('L', 'u', 'n', 'a', ' ', 'T', 'h', 'e', ' ', 'S', 't', 'a', 'r')
>>> print T[3:7]
('a', ' ', 'T', 'h')
>>> T[0] = 'Z'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

2. Tuple 비교

Tuple의 비교는 첫번째 요소를 비교한 다음 그 중 크고 작은 것으로 결정을 합니다.
만약 첫번째 요소가 같다면, 두번째 요소 비교 ...
마지막 요소까지 모두 같다면 같다고 판단합니다.
이 비교 방법은 Tuple 뿐만 아니라 String, List 등 모두 동일 합니다.

>>> T1 = ( 1, 2, 3, 4)
>>> T2 = ( 2, 1, 3, 4)
>>> T3 = ( 1, 2, 4, 3)
>>> T4 = ( 1, 2, 3, 4)
>>> T1 > T2
False
>>> T1 > T3
False
>>> T1 == T4
True

3. Tuple 할당

Python에서는 할당문(assignment) 의 좌변에 Tuple이 올 수 있습니다.
뿐만 아니라 좌변에 2개 이상의 변수를 놓고 우변에 Tuple 이나 List 등을 놓아 둘 수도 있습니다.

>>> T = ['Luna' , 'Star']
>>> l , s = T
>>> print l
Luna
>>> Ln = [ 1, 2, 3]
>>> v1, v2 ,v3 = Ln
>>> print v2
2

다른 언어에서 교체(swap) 기능을 이용할 때는
통상 임시 변수를 사용하거나,
굳이 임시변수를 안쓸려면 곱하기 나누기 등의 연산을 얼추 좀 복잡하게 써야했지만,
Python에서는 Tuple 할당을 이용하면 간단하게 가능합니다.

a, b = b, a

4. Dictionary 와 Tuple 

앞장에서 살짝 소개했지만 Dictionary의 item 들을 Tuple 들읠 List로 return 해주는 .items( ) 라는 method가 있습니다.

이를 이용해서 for 를 이용한 운행법(traversal) 도 앞장에서 미리 잠깐 살펴봤습니다.

>>> D = { 1:'Luna' , 2:'the' , 3:'Star' }
>>> LT = D.items()
>>> print LT
[(1, 'Luna'), (2, 'the'), (3, 'Star')]
>>> for K, V in D.items():
...     print K, V
...
1 Luna
2 the
3 Star

연습문제 09-1
연습문제08 에서 사용한 'mbox.txt'파일을 사용하여 다음의 작업을 하세요.
'mbox.txt'파일은 http://www.py4inf.com/code/mbox.txt 에서 다운로드가 가능합니다.
'From'으로 시작하는 line을 읽고 parsing 하여 가장 많은 commit을 한 사람의 e-mail 주소와 그 횟수를 출력하세요.
같은 라인에서 시간 문자열을 찾아서 분, 초 를 제외한 시간 ( 0 ~ 23 ) 사이 값에 대해서
각각 몇번씩 commit이 발생했는지를 찾아서,
가장 많이 commit을 한 시간부터 내림차순으로 시간 , commit 회수를 출력하세요.

연습문제 09-2
txt 파일을 읽어서 파일 안의 문자(letter)에 대하여 각각 몇번씩 있었는지 출력하세요.
대소문자 구분없이 카운팅을 하고, 특수문자등은 하지않습니다.
문자 빈도를 http://wikipedia.org/wiki/Letter_frequencies 와 비교해보세요.