<2-2> 리스트, 튜플
# Day_02_02_list.py
- Collection
[] : list
() : tuple
{} : set/dictionary
<> : not used
- list
1 2 3 4 5 6 | a = [1, 3, 5] print(a) # [1, 3, 5] print(a[0], a[1], a[2]) # 1 3 5 a[0] = 99 print(a) # [99, 3, 5] | cs |
>> 1 : list 의 선언
>> python 에서는 array 가 없다고 함.
>> 3 : 인덱스를 통한 접근
>> 5 : 값의 변경
- 반복문을 통한 접근
1 2 | for i in range(len(a)): print(a[i]) | cs |
>> len(a) : list 의 갯수를 리턴해준다.
- 문제
- 100 보다 작은 난수 10개로 이루어진 리스트를 반환하는 함수 만들기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | def makeRandom1(): a = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] for i in range(10): a[i] = random.range(100) return a def makeRandom2(): a = [0]*10 for i in range(10): a[i] = random.range(100) return a def makeRandom3(): a = [] for i in range(10): a.append(random.randrange(100)) return a | cs |
>> makeRandom3() 에서 처럼 append() 를 많이 쓴다고 한다.
>> 하지만 느리다고 한다.
>> append() 는 리스트의 맨 뒤에 내용을 추가.
- 문제
- 리스트를 거꾸로 뒤집는 함수 만들기
1 2 3 4 5 | def reverseList(c): size = len(c) for i in range(size//2): c[i], c[size-1-i] = c[size-1-i], c[i] return c | cs |
-
1 2 | for i in a: print(i, end=' ') | cs |
>> 여기서 a는 리스트
>> i는 인덱스가 아닌, 리스트의 각 요소
- range() 와 리스트의 타입
1 2 3 | print(type(range(5)), type(a)) # <class 'range'> <class 'list'> | cs |
>> range, list 는 utterable 객체
- reversed(obj)
1 2 3 4 5 6 7 8 9 | for i in a: print(i, end=' ') print() # 37 67 44 50 25 65 15 66 5 86 for i in reversed(a): print(i, end=' ') print() # 86 5 66 15 65 25 50 44 67 37 | cs |
>> list 가 뒤집어진 상태로 진행이 된다.
1 2 3 4 | for i in reversed(range(len(a))): print(a[i], end=' ') print() # 86 5 66 15 65 25 50 44 67 37 | cs |
>> 이런식으로도 가능하다.
- enumerate()
1 2 3 4 | for i in enumerate(a): print(i, end=' ') print() # (0, 37) (1, 67) (2, 44) (3, 50) (4, 25) (5, 65) (6, 15) (7, 66) (8, 5) (9, 86) | cs |
>> i는 (index, value) 의 형태를 갖는다. 데이터 타입은 튜플..!!
>> 특정 데이터가 몇번째 데이터인지 알고 싶을 때 enumerate() 을 사용
1 2 3 4 | for i in enumerate(a): print(i[0], i[1], end=' ') print() # 0 37 1 67 2 44 3 50 4 25 5 65 6 15 7 66 8 5 9 86 | cs |
>> 괄호를 없애고 싶을 땐 인덱스를 활용한다.
- 튜플(tuple)은 리스트의 상수버전...
- 리스트와 사용방법이 동일하다. 다만, 내용을 바꿀수 없을 뿐..!!
1 2 3 | t = (1, 2, 3) t[0] = 99 # TypeError: 'tuple' object does not support item assignment | cs |
>> 튜플은 보통 파이썬이 사용한다.
>> 매개변수를 전달하거나, 반환값을 전달할 때.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | def sumOfOddEven(): odd, even = 0, 0 for i in range(1, 100): if i%2 == 1: odd += i else : even += i return odd, even s1, s2 = sumOfOddEven() print(s1, s2) # 2500 2450 s = sumOfOddEven() print(s) # (2500, 2450) print(type(s)) # <class 'tuple'> | cs |
>> 13 : s 의 타입은 튜플이다.
1 2 3 | t = 1, 2 print(t) # (1, 2) print(type(t)) # <class 'tuple'> | cs |
- 그래서 enumerate() 이런식으로 사용한다.
1 2 3 | for i, k in enumerate(a): print(i, k, end=' ') print() | cs |
- list 로 강제 캐스팅하기
1 2 | a = list(range(0, 10, 2)) print(a) # [0, 2, 4, 6, 8] | cs |
- 레퍼런스
1 2 3 4 5 6 7 | a = list(range(0, 10, 2)) print(a) # [0, 2, 4, 6, 8] b = a; a[0] = 99 print(a) # [99, 2, 4, 6, 8] print(b) # [99, 2, 4, 6, 8] | cs |
>> 6 번 라인의 결과는 명확하다.
>> 7 번 라인의 결과는..???
레퍼런스 개념으로 a와 b는 같은 리스트를 가리킨다..!!
>> 4 번 라인을 얕은복사 라고 한다. (shallow copy)
>> 데이터가 같이 바뀌므로 주의해야한다.
- 데이터의 복사 (깊은복사)
1 2 3 4 5 6 7 | a = list(range(0, 10, 2)) print(a) # [0, 2, 4, 6, 8] c = a.copy(); a[0] = 99 print(a) # [99, 2, 4, 6, 8] print(c) # [0, 2, 4, 6, 8] | cs |
>> copy() 를 사용한다.
- 음수 인덱스
1 2 3 | a = list(range(0, 10, 2)) print(a) # [0, 2, 4, 6, 8] print(a[0], a[-1]) # 0 8 | cs |
>> 파이썬은 음수 인덱스를 지원한다. -1은 마지막 값, -2은 뒤에서 두번째 값
'Language > Python' 카테고리의 다른 글
<3-1> 파일 입출력 (0) | 2018.02.23 |
---|---|
<2-3> 기상청의 전국 날씨정보 파싱, 외부 모듈 추가 (0) | 2018.02.22 |
<2-1> 제어문과 반복문의 연결고리 (0) | 2018.02.06 |
<1-7> 정규표현식 with Python (0) | 2018.02.03 |
<1-6> 정규표현식 (Regular Expression) (0) | 2018.02.02 |