How We Coding



# Day_02_02_list.py


- Collection 

[] : list

() : tuple

{} : set/dictionary

<> : not used



- list


1
2
3
4
5
6
= [135]
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 = [0000000000]
    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
= (123)
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 = 00
    for i in range(1100):
        if i%2 == 1: odd  += i
        else :       even += i
 
    return odd, even
 
 
s1, s2 = sumOfOddEven()
print(s1, s2)       # 2500 2450
 
= sumOfOddEven()
print(s)            # (2500, 2450)
print(type(s))      # <class 'tuple'>
cs


>> 13 : s 의 타입은 튜플이다.


1
2
3
= 12
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
= list(range(0102))
print(a)    # [0, 2, 4, 6, 8]
cs



- 레퍼런스

 

1
2
3
4
5
6
7
= list(range(0102))
print(a)    # [0, 2, 4, 6, 8]
 
= 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
= list(range(0102))
print(a)    # [0, 2, 4, 6, 8]
 
= a.copy();
a[0= 99
print(a)    # [99, 2, 4, 6, 8]
print(c)    # [0, 2, 4, 6, 8]
cs


>> copy() 를 사용한다.



- 음수 인덱스


1
2
3
= list(range(0102))
print(a)    # [0, 2, 4, 6, 8]
print(a[0], a[-1])      # 0 8
cs


>>  파이썬은 음수 인덱스를 지원한다. -1은 마지막 값, -2은 뒤에서 두번째 값