회원 로그인
|
Python 5강 - 리스트
Python05-1.asf
Python 5강
리스트
1. 리스트의 일반 연산
2. 중첩 리스트(nested lists)
3. 리스트의 메쏘드들
4. 리스트의 리스트를 반복 참조하기
5. 정렬하기
6. 리스트 내장(list comprehension)
7. 순환 참조 리스트
8. range
9. 예제들
1. 리스트의 일반 연산
#기본 시퀀스 자료형 연산
인덱싱, 슬라이싱, 반복, 연결, 길이...
>>> L = [1, 2, 3, 'spam', 'ham']
>>> L[0] #인덱싱
1
>>> L[1:4] #슬라이싱
[2, 3, 'spam']
>>> L * 2 #반복
[1, 2, 3, 'spam', 'ham', 1, 2, 3, 'spam', 'ham']
>>> L + L #연결
[1, 2, 3, 'spam', 'ham', 1, 2, 3, 'spam', 'ham']
>>> len(L) #길이
5
>>> 3 in L #L안에 3이 있는지 찾기
True
#값 변경
#슬라이스 치환
L[1:3] = [1, 2, 3]
>>> L[1:3]
[2, 3]
>>> L[1:3] = [100, 200, 300] #치환
>>> L
[1, 100, 200, 300, 'spam', 'ham']
#슬라이스 삭제
L[1:3] = []
del L[1:3]
>>> L
[1, 100, 200, 300, 'spam', 'ham']
>>> L[1:3] = [] #1~3에 공백을 넣거나
>>> L
[1, 300, 'spam', 'ham']
>>> del L[1:3] #del로 1~3 리스트를 삭제
>>> L
[1, 'ham']
#슬라이스 삽입
L[1:1] = [1, 2, 3]
>>> L[1:1] = [2, 3, 'spam']
>>> L
[1, 2, 3, 'spam', 'ham']
2. 중첩 리스트(nested lists)
#리스트 안의 또 다른 리스트
>>> s = [1, 2, 3]
>>> t = ['begin', s, 'end'] #리스트 안에 변수를 넣어 중첩 리스트를 만들수 있다.
>>> t
['begin', [1, 2, 3], 'end']
>>> t[1][1] #중첩리스트 위치 확인 t[1]의 [1](s[1])을 찾는 것
2
3. 리스트의 메쏘드들
메쏘드 설명
append 자료를 리스트 끝에 추가 (혹은 스택의 push)
insert 자료를 지정된 위치에 삽입
index 요소 검색(Search)
count 요소 개수 알아내기
sort 리스트 정렬
reverse 자료 순서 바꾸기
remove 지정 자료 값 한개 삭제
pop 리스트의 마지막 값을 읽어내고 삭제(스택의 pop)
extend 리스트를 추가
>>> L
[1, 'egg', 2, 3, 'spam', 'ham', 5]
>>> L.append(1) #리스트 뒤에 1을 추가
>>> L
[1, 'egg', 2, 3, 'spam', 'ham', 5, 1]
>>> L.count(1) #리스트 안에 1이 몇개가 있는지 확인
2
>>> L.count('egg')
1
>>> L.count('python') #없으면 0
0
>>> L.sort() #리스트 정렬
>>> L
[1, 1, 2, 3, 5, 'egg', 'ham', 'spam']
>>> cmp #cmp 정렬하는 기준 함수(두개의 데이터를 인수로 받는 함수)
>>> cmp(1, 2) #뒷수가 크면 음수
-1
>>> cmp(1, 1) #같으면 0
0
>>> cmp(2, 1) #앞수가 크면 양수
1
>>> cmp(5, 'egg') #숫자가 문자 앞에 있으므로 음수
-1 #5가 egg보다 위치상 낮으니깐 -1
>>> cmp('egg', 5) #egg가 5보다 위치상 높으니깐 1
1
cmp(a, b) 정렬을 하는 기본 함수 : a - b와 같다.
>>> L.sort()
>>> M = L.sort() #리턴하기 위해 변수를 사용해도 되지 않고
>>> M
>>> L #sort한 L에게만 적용
[1, 1, 2, 3, 5, 'egg', 'ham', 'spam']
>>> L.reverse() #데이터들의 위치를 반전
>>> L
['spam', 'ham', 'egg', 5, 3, 2, 1, 1]
>>> L.remove('egg') #지정된 데이터를 삭제한다.
>>> L
['spam', 'ham', 5, 3, 2, 1, 1]
>>> L.remove(1) #똑같은 여러개의 데이터는 하나씩 삭제하게 된다.
>>> L
['spam', 'ham', 5, 3, 2, 1]
>>> L.pop() #뒤 데이터부터 하나씩 뺀다
1
>>> L
['spam', 'ham', 5, 3, 2]
>>> L.pop()
2
>>> L
['spam', 'ham', 5, 3]
>>> L.pop(0) #위치를 넣으면 해당 위치의 데이터만 뺀다.
'spam'
>>> L.append(10) #append는 뒤에서 하나씩 추가하지만
>>> L
['ham', 5, 3, 10]
>>> L.extend( [100, 200, 'spam', 'egg'] ) #extend는 한꺼번에 뒤에 리스트를 추가한다.
>>> L
['ham', 5, 3, 10, 100, 200, 'spam', 'egg']
Python05-1.asf 10:35
#리스트를 스택(stack)으로 쓰기
append(s), pop()
stack - LIFO (Last In First Out)
넣을 때는 append()
뺄 때는 pop()
>>> L = [5, 3, 10, 100, 200, 'spam', 'ham']
>>> L
[5, 3, 10, 100, 200, 'spam', 'ham']
>>> L.append(1) #뒤에다 1을 넣고,
>>> L
[5, 3, 10, 100, 200, 'spam', 'ham', 1]
>>> a = L.pop() #뺄 때는 정해진 변수에도 넣을 수 있다.
>>> a
1
>>> L
[5, 3, 10, 100, 200, 'spam', 'ham']
#리스트를 큐(queue)로 쓰기
append(s), pop(0)
queue - FIFO (First in First Out)
>>> L.append(1)
>>> L
[5, 3, 10, 100, 200, 'spam', 'ham', 1]
>>> L.pop(0) #0번째 꺼내기
5
>>> L.pop(1) #1번째 꺼내기
10
>>> L
[3, 100, 200, 'spam', 'ham', 1]
4. 리스트의 리스트를 반복 참조하기
>>> lt = [('one', 1), ('two', 2)] #리스트 안에 튜플
>>> for t in lt:
print 'name=', t[0], 'num=', t[1]
name= one num= 1
name= two num= 2
>>> for t in lt: #다른 방법으로 출력(참조)
print 'name=%s, num=%s' % t
name=one, num=1
name=two, num=2
>>> for name, num in lt: #다른 방법으로 출력(참조)
print name, num
one 1
two 2
5. 정렬하기
원하는 순서대로 정렬하기
#cmp(a, b) 내장 함수
a < b 일 때 -1
a == 일 때 0
a > b 일 때 1 리턴
cmp(a, b) 비교 함수
#사용자 정의 비교 함수를 이용한 정렬
>>> def mycmp(a1, a2): #def 함수 정의-하나의 함수를 만들수 있다.
return cmp(a2, a1) #cmp(a2, a1) 함수와 반대
>>> L = [1, 5, 3, 2, 4, 6]
>>> L.sort(mycmp)
>>> print L
[6, 5, 4, 3, 2, 1] #큰 값에서 작은 값으로 출력
>>> L = [('one', 1), ('two', 2), ('three', 3), ('four', 4)] #리스트 안에 튜플 사용시
>>> L.sort() #sort하게 되면
>>> L #영문 앞 알파벳에 의해 정렬이 된다.
[('four', 4), ('one', 1), ('three', 3), ('two', 2)]
영문이 아닌 숫자 기준으로 사용자 정렬을 하고 싶다면
>>> def mycmp(a1, a2): #함수를 만들고
return cmp(a1[1], a2[1]) #1번째 데이터 값을 리턴
>>> mycmp(('one', 1), ('four', 4)) #각 튜플의 1번째 데이터 비교
-1 #1과 4를 비교하므로 -1
>>> L
[('four', 4), ('one', 1), ('three', 3), ('two', 2)]
>>> L.sort(mycmp) #sort하면 1번째 데이터 값인 숫자로 정렬이 된다.
>>> L
[('one', 1), ('two', 2), ('three', 3), ('four', 4)]
Python05-1.asf 끝
Python05-2.asf
6. 리스트 내장(list comprehension)
#리스트 내장이란?
리스트를 쉽게 생성하기 위한 기능
>>> L = [k *k for k in range(10)] #리스트 안에 연산명령을 줄 수 있다.
>>> L #연산된 것이 리스트에 쌓이게 된다.
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
다른 방법
>>> L = []
>>> for k in range(10):
L.append(k*k)
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
#일반 형식
[ expression for expr in sequence1
for expr2 in sequence2 ...
for exprN in sequence1
if condition ]
예:2의 배수와 3의 배수 중 두 합이 7의 배수가 되는 두수의 곱의 리스트
>>> [(i, j, i*j) for i in range(2, 100, 2) #(i, j, i*j)는 expression, for문 2의 배수 결과는 i
for j in range(3, 100, 3) #for문 3의 배수 j
if (i + j) % 7 == 0] #조건에 맞게 되면 expression 수행
[(2, 12, 24), (2, 33, 66), ...... (98, 63, 6174), (98, 84, 8232)]
>>> (98 + 84) % 7 #(2의배수 + 3의배수) % 7 (7의 배수)의 나머지가 0인
0
>>> [ (x, y) for x in range(10) for y in range(10, 20)]
[(0, 10), (0, 11), ...... (9, 18), (9, 19)]
>>> [ x, y for x in range(10) for y in range(10, 20)] #()괄호를 해야 오류가 없다.
SyntaxError: invalid syntax
05:35
7. 순환 참조 리스트
#어떤 객체가 자기 자신을 직, 간접으로 참조하는 경우
>>> GNU = ['is not Unix'] #
>>> GNU.insert(0, GNU) #0은 자기 자신
>>> GNU #[...]순환되는 리스트
[[...], 'is not Unix']
#순환 참조를 써야 할 경우는 15장 약한 참조를 이용한다.
약한 참조란 참조 카운트에 포함되지 않는 참조를 의미한다.
8. range
#range(10) #0~10 시작 0, 종료 9, 스텝 1 (10은 포함하지 않는다)
#range(1, 10) #1~10 시작 1, 종료 9, 스텝 2
#range(1, 10, 2) #1~10 시작 1, 종료 9, 스텝 2
#range(0, -10, -1) #0~-10 시작 0, 종료 -9, 스텝 -1
>>> range(0, -10, -1)
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
#sun, mon, tue, wed, thu, fri, sat = range(7)
자동으로 0 ~ 6까지의 인덱스를 가진다.
9. 예제들
리스트를 활용한 몇 가지 예들
#지역적으로 사용가능한 이름의 리스트 얻기 - dir()
dir() - 지역(local영역) 이름 리스트 얻기
dir(sys) - 모듈, 클래스등의 이름 리스트 얻기
>>> dir() #dir()함수의 리스트 확인
['__builtins__', '__doc__', '__name__']
>>> def f(a, b):
print dir()
>>> f(1, 2)
['a', 'b']
>>> dir()
['__builtins__', '__doc__', '__name__', 'f', 'sys']
>>> import sys
>>> dir(sys) #sys객체의 리스트를 확인할 수 있다.
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__', '__stdin__', '__stdout__', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'exc_clear', 'exc_info', 'exc_traceback', 'exc_type', 'exc_value', 'excepthook', 'exec_prefix', 'executable', 'exit', 'getcheckinterval', 'getdefaultencoding', 'getfilesystemencoding', 'getrecursionlimit', 'getrefcount', 'getwindowsversion', 'hexversion', 'maxint', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions', 'winver']
Python05-2.asf 11:45
linux에서의 실행 처리
#명령행 인수 처리
sys.argv
#명령행 옵션 처리
getopt.getopt(인수리스트, 옵션문자열)
리턴 : 옵션 리스트, 나머지 인수 리스트
>>> import getopt
>>> s = '-a -b -c123 -d 456 spam and ham'
>>> args = s.split() #스페이스에 분리된 문자열을
>>> args #각 문자열이 옵션이 된다.
['-a', '-b', '-c123', '-d', '456', 'spam', 'and', 'ham']
>>> optlist, args = getopt.getopt(args, 'abc:d:')
getopt.getopt(args, 'abc:d:') args는 인수 리스트, 'abc:d:'는 옵션 리스트
a와 b는 다른 옵션값을 가지고 있지 않으므로 그냥 쓰고, c와 d는 123, 456 옵션값(추가 파라메터)이 있으므로 뒤에 :를 붙여주게 된다.
>>> optlist #출력해 보면 옵션 리스트의 a, b는 공백, c, d는 값을 가지는 것을 볼 수 있고,
[('-a', ''), ('-b', ''), ('-c', '123'), ('-d', '456')]
>>> args #나머지는 인수 리스트가 된다.
['spam', 'and', 'ham']
Python05-2.asf 끝
Python05-2.asf
#배열 표현하기
리스트로 1차원 배열 표현하기
A = [1, 2, 3, 4, 5]
A = range(10) #길이 데이터
A = [0] * 10 #반복 데이터
A = [None] * 10 #공백
리스트로 2차원 배열 표현하기
mat = [ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ] #중첩 리스트로 2차원 배열
mat[1][2] # 6
리스트로 배열 표현하는데 주의할 점
mat = [[0] * 4] * 3 #3에 참조만 될뿐이다.
>>> mat = [[0] * 4] * 3
>>> mat
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> mat[0][0] = 100
>>> mat
[[100, 0, 0, 0], [100, 0, 0, 0], [100, 0, 0, 0]]
mat = [[0] * 4 for x in range(3)] #이제 정상적인 표현 방법
>>> mat = [[0] * 4 for x in range(3)]
>>> mat[0][0] = 100
>>> mat
[[100, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
리스트를 사용하지 않교 배열 표현하는 방법
array 모듈 이용하기
같은 종류의 기본 자료형 1차원 배열
리스트와 같은 참조 구조(포인터)가 아니라, 연속 데이터 배열 구조임
>>> from array import*
>>> a = array('i', range(10)) #순차 데이터 생성하기
>>> a
array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
리스트와 유사한 메쏘드 제공
>>> dir(a)
['__add__', '__class__', '__contains__', '__copy__', '__deepcopy__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__str__', 'append', 'buffer_info', 'byteswap', 'count', 'extend', 'fromfile', 'fromlist', 'fromstring', 'fromunicode', 'index', 'insert', 'itemsize', 'pop', 'read', 'remove', 'reverse', 'tofile', 'tolist', 'tostring', 'tounicode', 'typecode', 'write']
자세한 내용은 Library Reference 혹은 책pp175 참조
Numeric Python의 이용
배열을 이용한 각종 수학적 연산 지원(선형대수, FFT등 포함)
CD-ROM packages/Etc/NumericPython안의 ... 설치
혹은 http://pfdubois.com/numpy/ 참조
>>> from Numeric import *
>>> a = array ( ((1, 2, 3),) )
>>> a = array ( ((1, 2, 3),
(4, 5, 6),
(7, 8, 9))
)
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> a[0][1]
2
>>> a * a
array([[1, 4, 9],
[16, 25, 36],
[49, 64, 81]])
>>> a + 2
array([[3, 4, 5],
[6, 7, 8],
[9, 10, 11]])
>>> sin(a) #각 연산이 가능하다.
array([[ 0.84147098, 0.90929743, 0.14112001],
[-0.7568025 , -0.95892427, -0.2794155 ],
[ 0.6569866 , 0.98935825, 0.41211849]])
>>> b = array( ((3, 2, 1),
(5, 2, 3),
(5, 2, 1))
)
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> b
array([[3, 2, 1],
[5, 2, 3],
[5, 2, 1]])
>>> a * b #두 객체의 연산도 가능
array([[ 3, 4, 3],
[20, 10, 18],
[35, 16, 9]])
>>> matrixmultiply(a, b) #외적
array([[ 28, 12, 10],
[ 67, 30, 25],
[106, 48, 40]])
파일 목록 얻기
glob.glob()
와일드 카드 문자 사용
?, *, [...]
>>> import glob
>>> glob.glob('*.py') #현재 폴더의 파일 목록을 얻을 수 있다.
[]
>>> glob.glob('d:tmp*.py') #지정 폴더 안에 목록도 얻을 수 있다.
[]
>>> glob.glob('[abc]*.py') #파일의 앞 a~c만 얻는다.
[]
파일 정보 얻기
os.path 모듈
isfile(), isdir(), islink(), ismount(), ...
>>> import os
>>> for file in glob.glob('*.py'): #파일명 불러오기
if os.path.isfile(file):
print 'normal file', file
...
>>> for file in glob.glob('*.py'): #파일명과 파일의 사이즈(byte) 불러오기
if os.path.isfile(file):
print 'normal file', file, os.path.getsize(file)
...
Python05-2.asf 끝
Python 5강
리스트
1. 리스트의 일반 연산
2. 중첩 리스트(nested lists)
3. 리스트의 메쏘드들
4. 리스트의 리스트를 반복 참조하기
5. 정렬하기
6. 리스트 내장(list comprehension)
7. 순환 참조 리스트
8. range
9. 예제들
1. 리스트의 일반 연산
#기본 시퀀스 자료형 연산
인덱싱, 슬라이싱, 반복, 연결, 길이...
>>> L = [1, 2, 3, 'spam', 'ham']
>>> L[0] #인덱싱
1
>>> L[1:4] #슬라이싱
[2, 3, 'spam']
>>> L * 2 #반복
[1, 2, 3, 'spam', 'ham', 1, 2, 3, 'spam', 'ham']
>>> L + L #연결
[1, 2, 3, 'spam', 'ham', 1, 2, 3, 'spam', 'ham']
>>> len(L) #길이
5
>>> 3 in L #L안에 3이 있는지 찾기
True
#값 변경
#슬라이스 치환
L[1:3] = [1, 2, 3]
>>> L[1:3]
[2, 3]
>>> L[1:3] = [100, 200, 300] #치환
>>> L
[1, 100, 200, 300, 'spam', 'ham']
#슬라이스 삭제
L[1:3] = []
del L[1:3]
>>> L
[1, 100, 200, 300, 'spam', 'ham']
>>> L[1:3] = [] #1~3에 공백을 넣거나
>>> L
[1, 300, 'spam', 'ham']
>>> del L[1:3] #del로 1~3 리스트를 삭제
>>> L
[1, 'ham']
#슬라이스 삽입
L[1:1] = [1, 2, 3]
>>> L[1:1] = [2, 3, 'spam']
>>> L
[1, 2, 3, 'spam', 'ham']
2. 중첩 리스트(nested lists)
#리스트 안의 또 다른 리스트
>>> s = [1, 2, 3]
>>> t = ['begin', s, 'end'] #리스트 안에 변수를 넣어 중첩 리스트를 만들수 있다.
>>> t
['begin', [1, 2, 3], 'end']
>>> t[1][1] #중첩리스트 위치 확인 t[1]의 [1](s[1])을 찾는 것
2
3. 리스트의 메쏘드들
메쏘드 설명
append 자료를 리스트 끝에 추가 (혹은 스택의 push)
insert 자료를 지정된 위치에 삽입
index 요소 검색(Search)
count 요소 개수 알아내기
sort 리스트 정렬
reverse 자료 순서 바꾸기
remove 지정 자료 값 한개 삭제
pop 리스트의 마지막 값을 읽어내고 삭제(스택의 pop)
extend 리스트를 추가
>>> L
[1, 'egg', 2, 3, 'spam', 'ham', 5]
>>> L.append(1) #리스트 뒤에 1을 추가
>>> L
[1, 'egg', 2, 3, 'spam', 'ham', 5, 1]
>>> L.count(1) #리스트 안에 1이 몇개가 있는지 확인
2
>>> L.count('egg')
1
>>> L.count('python') #없으면 0
0
>>> L.sort() #리스트 정렬
>>> L
[1, 1, 2, 3, 5, 'egg', 'ham', 'spam']
>>> cmp #cmp 정렬하는 기준 함수(두개의 데이터를 인수로 받는 함수)
>>> cmp(1, 2) #뒷수가 크면 음수
-1
>>> cmp(1, 1) #같으면 0
0
>>> cmp(2, 1) #앞수가 크면 양수
1
>>> cmp(5, 'egg') #숫자가 문자 앞에 있으므로 음수
-1 #5가 egg보다 위치상 낮으니깐 -1
>>> cmp('egg', 5) #egg가 5보다 위치상 높으니깐 1
1
cmp(a, b) 정렬을 하는 기본 함수 : a - b와 같다.
>>> L.sort()
>>> M = L.sort() #리턴하기 위해 변수를 사용해도 되지 않고
>>> M
>>> L #sort한 L에게만 적용
[1, 1, 2, 3, 5, 'egg', 'ham', 'spam']
>>> L.reverse() #데이터들의 위치를 반전
>>> L
['spam', 'ham', 'egg', 5, 3, 2, 1, 1]
>>> L.remove('egg') #지정된 데이터를 삭제한다.
>>> L
['spam', 'ham', 5, 3, 2, 1, 1]
>>> L.remove(1) #똑같은 여러개의 데이터는 하나씩 삭제하게 된다.
>>> L
['spam', 'ham', 5, 3, 2, 1]
>>> L.pop() #뒤 데이터부터 하나씩 뺀다
1
>>> L
['spam', 'ham', 5, 3, 2]
>>> L.pop()
2
>>> L
['spam', 'ham', 5, 3]
>>> L.pop(0) #위치를 넣으면 해당 위치의 데이터만 뺀다.
'spam'
>>> L.append(10) #append는 뒤에서 하나씩 추가하지만
>>> L
['ham', 5, 3, 10]
>>> L.extend( [100, 200, 'spam', 'egg'] ) #extend는 한꺼번에 뒤에 리스트를 추가한다.
>>> L
['ham', 5, 3, 10, 100, 200, 'spam', 'egg']
Python05-1.asf 10:35
#리스트를 스택(stack)으로 쓰기
append(s), pop()
stack - LIFO (Last In First Out)
넣을 때는 append()
뺄 때는 pop()
>>> L = [5, 3, 10, 100, 200, 'spam', 'ham']
>>> L
[5, 3, 10, 100, 200, 'spam', 'ham']
>>> L.append(1) #뒤에다 1을 넣고,
>>> L
[5, 3, 10, 100, 200, 'spam', 'ham', 1]
>>> a = L.pop() #뺄 때는 정해진 변수에도 넣을 수 있다.
>>> a
1
>>> L
[5, 3, 10, 100, 200, 'spam', 'ham']
#리스트를 큐(queue)로 쓰기
append(s), pop(0)
queue - FIFO (First in First Out)
>>> L.append(1)
>>> L
[5, 3, 10, 100, 200, 'spam', 'ham', 1]
>>> L.pop(0) #0번째 꺼내기
5
>>> L.pop(1) #1번째 꺼내기
10
>>> L
[3, 100, 200, 'spam', 'ham', 1]
4. 리스트의 리스트를 반복 참조하기
>>> lt = [('one', 1), ('two', 2)] #리스트 안에 튜플
>>> for t in lt:
print 'name=', t[0], 'num=', t[1]
name= one num= 1
name= two num= 2
>>> for t in lt: #다른 방법으로 출력(참조)
print 'name=%s, num=%s' % t
name=one, num=1
name=two, num=2
>>> for name, num in lt: #다른 방법으로 출력(참조)
print name, num
one 1
two 2
5. 정렬하기
원하는 순서대로 정렬하기
#cmp(a, b) 내장 함수
a < b 일 때 -1
a == 일 때 0
a > b 일 때 1 리턴
cmp(a, b) 비교 함수
#사용자 정의 비교 함수를 이용한 정렬
>>> def mycmp(a1, a2): #def 함수 정의-하나의 함수를 만들수 있다.
return cmp(a2, a1) #cmp(a2, a1) 함수와 반대
>>> L = [1, 5, 3, 2, 4, 6]
>>> L.sort(mycmp)
>>> print L
[6, 5, 4, 3, 2, 1] #큰 값에서 작은 값으로 출력
>>> L = [('one', 1), ('two', 2), ('three', 3), ('four', 4)] #리스트 안에 튜플 사용시
>>> L.sort() #sort하게 되면
>>> L #영문 앞 알파벳에 의해 정렬이 된다.
[('four', 4), ('one', 1), ('three', 3), ('two', 2)]
영문이 아닌 숫자 기준으로 사용자 정렬을 하고 싶다면
>>> def mycmp(a1, a2): #함수를 만들고
return cmp(a1[1], a2[1]) #1번째 데이터 값을 리턴
>>> mycmp(('one', 1), ('four', 4)) #각 튜플의 1번째 데이터 비교
-1 #1과 4를 비교하므로 -1
>>> L
[('four', 4), ('one', 1), ('three', 3), ('two', 2)]
>>> L.sort(mycmp) #sort하면 1번째 데이터 값인 숫자로 정렬이 된다.
>>> L
[('one', 1), ('two', 2), ('three', 3), ('four', 4)]
Python05-1.asf 끝
Python05-2.asf
6. 리스트 내장(list comprehension)
#리스트 내장이란?
리스트를 쉽게 생성하기 위한 기능
>>> L = [k *k for k in range(10)] #리스트 안에 연산명령을 줄 수 있다.
>>> L #연산된 것이 리스트에 쌓이게 된다.
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
다른 방법
>>> L = []
>>> for k in range(10):
L.append(k*k)
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
#일반 형식
[ expression for expr in sequence1
for expr2 in sequence2 ...
for exprN in sequence1
if condition ]
예:2의 배수와 3의 배수 중 두 합이 7의 배수가 되는 두수의 곱의 리스트
>>> [(i, j, i*j) for i in range(2, 100, 2) #(i, j, i*j)는 expression, for문 2의 배수 결과는 i
for j in range(3, 100, 3) #for문 3의 배수 j
if (i + j) % 7 == 0] #조건에 맞게 되면 expression 수행
[(2, 12, 24), (2, 33, 66), ...... (98, 63, 6174), (98, 84, 8232)]
>>> (98 + 84) % 7 #(2의배수 + 3의배수) % 7 (7의 배수)의 나머지가 0인
0
>>> [ (x, y) for x in range(10) for y in range(10, 20)]
[(0, 10), (0, 11), ...... (9, 18), (9, 19)]
>>> [ x, y for x in range(10) for y in range(10, 20)] #()괄호를 해야 오류가 없다.
SyntaxError: invalid syntax
05:35
7. 순환 참조 리스트
#어떤 객체가 자기 자신을 직, 간접으로 참조하는 경우
>>> GNU = ['is not Unix'] #
>>> GNU.insert(0, GNU) #0은 자기 자신
>>> GNU #[...]순환되는 리스트
[[...], 'is not Unix']
#순환 참조를 써야 할 경우는 15장 약한 참조를 이용한다.
약한 참조란 참조 카운트에 포함되지 않는 참조를 의미한다.
8. range
#range(10) #0~10 시작 0, 종료 9, 스텝 1 (10은 포함하지 않는다)
#range(1, 10) #1~10 시작 1, 종료 9, 스텝 2
#range(1, 10, 2) #1~10 시작 1, 종료 9, 스텝 2
#range(0, -10, -1) #0~-10 시작 0, 종료 -9, 스텝 -1
>>> range(0, -10, -1)
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
#sun, mon, tue, wed, thu, fri, sat = range(7)
자동으로 0 ~ 6까지의 인덱스를 가진다.
9. 예제들
리스트를 활용한 몇 가지 예들
#지역적으로 사용가능한 이름의 리스트 얻기 - dir()
dir() - 지역(local영역) 이름 리스트 얻기
dir(sys) - 모듈, 클래스등의 이름 리스트 얻기
>>> dir() #dir()함수의 리스트 확인
['__builtins__', '__doc__', '__name__']
>>> def f(a, b):
print dir()
>>> f(1, 2)
['a', 'b']
>>> dir()
['__builtins__', '__doc__', '__name__', 'f', 'sys']
>>> import sys
>>> dir(sys) #sys객체의 리스트를 확인할 수 있다.
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__', '__stdin__', '__stdout__', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'exc_clear', 'exc_info', 'exc_traceback', 'exc_type', 'exc_value', 'excepthook', 'exec_prefix', 'executable', 'exit', 'getcheckinterval', 'getdefaultencoding', 'getfilesystemencoding', 'getrecursionlimit', 'getrefcount', 'getwindowsversion', 'hexversion', 'maxint', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions', 'winver']
Python05-2.asf 11:45
linux에서의 실행 처리
#명령행 인수 처리
sys.argv
#명령행 옵션 처리
getopt.getopt(인수리스트, 옵션문자열)
리턴 : 옵션 리스트, 나머지 인수 리스트
>>> import getopt
>>> s = '-a -b -c123 -d 456 spam and ham'
>>> args = s.split() #스페이스에 분리된 문자열을
>>> args #각 문자열이 옵션이 된다.
['-a', '-b', '-c123', '-d', '456', 'spam', 'and', 'ham']
>>> optlist, args = getopt.getopt(args, 'abc:d:')
getopt.getopt(args, 'abc:d:') args는 인수 리스트, 'abc:d:'는 옵션 리스트
a와 b는 다른 옵션값을 가지고 있지 않으므로 그냥 쓰고, c와 d는 123, 456 옵션값(추가 파라메터)이 있으므로 뒤에 :를 붙여주게 된다.
>>> optlist #출력해 보면 옵션 리스트의 a, b는 공백, c, d는 값을 가지는 것을 볼 수 있고,
[('-a', ''), ('-b', ''), ('-c', '123'), ('-d', '456')]
>>> args #나머지는 인수 리스트가 된다.
['spam', 'and', 'ham']
Python05-2.asf 끝
Python05-2.asf
#배열 표현하기
리스트로 1차원 배열 표현하기
A = [1, 2, 3, 4, 5]
A = range(10) #길이 데이터
A = [0] * 10 #반복 데이터
A = [None] * 10 #공백
리스트로 2차원 배열 표현하기
mat = [ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ] #중첩 리스트로 2차원 배열
mat[1][2] # 6
리스트로 배열 표현하는데 주의할 점
mat = [[0] * 4] * 3 #3에 참조만 될뿐이다.
>>> mat = [[0] * 4] * 3
>>> mat
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> mat[0][0] = 100
>>> mat
[[100, 0, 0, 0], [100, 0, 0, 0], [100, 0, 0, 0]]
mat = [[0] * 4 for x in range(3)] #이제 정상적인 표현 방법
>>> mat = [[0] * 4 for x in range(3)]
>>> mat[0][0] = 100
>>> mat
[[100, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
리스트를 사용하지 않교 배열 표현하는 방법
array 모듈 이용하기
같은 종류의 기본 자료형 1차원 배열
리스트와 같은 참조 구조(포인터)가 아니라, 연속 데이터 배열 구조임
>>> from array import*
>>> a = array('i', range(10)) #순차 데이터 생성하기
>>> a
array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
리스트와 유사한 메쏘드 제공
>>> dir(a)
['__add__', '__class__', '__contains__', '__copy__', '__deepcopy__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__str__', 'append', 'buffer_info', 'byteswap', 'count', 'extend', 'fromfile', 'fromlist', 'fromstring', 'fromunicode', 'index', 'insert', 'itemsize', 'pop', 'read', 'remove', 'reverse', 'tofile', 'tolist', 'tostring', 'tounicode', 'typecode', 'write']
자세한 내용은 Library Reference 혹은 책pp175 참조
Numeric Python의 이용
배열을 이용한 각종 수학적 연산 지원(선형대수, FFT등 포함)
CD-ROM packages/Etc/NumericPython안의 ... 설치
혹은 http://pfdubois.com/numpy/ 참조
>>> from Numeric import *
>>> a = array ( ((1, 2, 3),) )
>>> a = array ( ((1, 2, 3),
(4, 5, 6),
(7, 8, 9))
)
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> a[0][1]
2
>>> a * a
array([[1, 4, 9],
[16, 25, 36],
[49, 64, 81]])
>>> a + 2
array([[3, 4, 5],
[6, 7, 8],
[9, 10, 11]])
>>> sin(a) #각 연산이 가능하다.
array([[ 0.84147098, 0.90929743, 0.14112001],
[-0.7568025 , -0.95892427, -0.2794155 ],
[ 0.6569866 , 0.98935825, 0.41211849]])
>>> b = array( ((3, 2, 1),
(5, 2, 3),
(5, 2, 1))
)
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> b
array([[3, 2, 1],
[5, 2, 3],
[5, 2, 1]])
>>> a * b #두 객체의 연산도 가능
array([[ 3, 4, 3],
[20, 10, 18],
[35, 16, 9]])
>>> matrixmultiply(a, b) #외적
array([[ 28, 12, 10],
[ 67, 30, 25],
[106, 48, 40]])
파일 목록 얻기
glob.glob()
와일드 카드 문자 사용
?, *, [...]
>>> import glob
>>> glob.glob('*.py') #현재 폴더의 파일 목록을 얻을 수 있다.
[]
>>> glob.glob('d:tmp*.py') #지정 폴더 안에 목록도 얻을 수 있다.
[]
>>> glob.glob('[abc]*.py') #파일의 앞 a~c만 얻는다.
[]
파일 정보 얻기
os.path 모듈
isfile(), isdir(), islink(), ismount(), ...
>>> import os
>>> for file in glob.glob('*.py'): #파일명 불러오기
if os.path.isfile(file):
print 'normal file', file
...
>>> for file in glob.glob('*.py'): #파일명과 파일의 사이즈(byte) 불러오기
if os.path.isfile(file):
print 'normal file', file, os.path.getsize(file)
...
Python05-2.asf 끝
댓글 0개
| 엮인글 0개
285개(14/15페이지)
번호 | 제목 | 글쓴이 | 조회 | 날짜 |
---|---|---|---|---|
25 | [VisualStudio] Visual Studio Express 2012 다운로드/설치 | 푸딩뱃살 | 2731 | 2013.04.06 20:12 |
24 | [Python] DC 이효리 겔러리에서 사진 추출하기 | artsOne | 934 | 2009.03.27 01:54 |
23 | [Python] 클래스 안의 함수 실행 | artsOne | 2546 | 2012.09.20 11:54 |
22 | [Python] 기본 함수들 | artsOne | 4882 | 2012.09.12 15:39 |
21 | [Python] Config Parser | artsOne | 2265 | 2012.08.28 13:55 |
20 | [Python] win32 오픈오피스 실행 | artsOne | 2154 | 2012.08.01 17:38 |
19 | [Python] 문자열의 기호들을 출력하기 | artsOne | 2869 | 2009.04.17 11:59 |
18 | [Python] python 자료형 / 자료형 출력 | artsOne | 3394 | 2009.03.30 00:54 |
17 | [Python] win32 모듈로 Excel 사용하기 | artsOne | 4113 | 2008.03.18 02:24 |
16 | [Python] 용어 정리 | artsone | 3565 | 2008.02.26 23:11 |
15 | [Python] Python 9강 - 파일 | artsone | 9963 | 2007.11.03 02:59 |
14 | [Python] Python 8강 - 객체의 복사 및 형 변환 | artsone | 5220 | 2007.11.01 04:15 |
13 | [Python] Python 7강 - 사전 | artsone | 2871 | 2007.10.30 03:26 |
12 | [Python] Python 6강 - 튜플 | artsone | 3139 | 2007.10.24 05:30 |
>> | [Python] Python 5강 - 리스트 | artsone | 7339 | 2007.10.23 22:13 |
10 | [Python] Python 4강 - 문자열 | artsone | 3701 | 2007.10.20 03:04 |
9 | [Python] Python 3강 - 수치 자료형과 연산자 | artsone | 4198 | 2007.10.18 17:01 |
8 | [Python] Python 2강 - 파이썬 문과 기본 자료형 | artsone | 5316 | 2007.10.15 02:25 |
7 | [Python] Python 1강 - 파이썬이란? | artsOne | 3419 | 2007.10.11 23:36 |
6 | [Python] [스크랩] Python은 무엇인가? | artsone | 2001 | 2008.02.26 16:20 |