본문 바로가기

😀 기초/파이썬(Python)

2장 파이썬 기초문법(2.8장 ~ 2.10)

2.8 여러 개의 자료를 한 변수에 담기

 

1. 여러 개의 자료를 한 변수에 담기

  • 지금까지는 하나의 변수에 하나의 자료를 저장
  • 하지만 여러개의 자료를 저장할 필요가 있음
  • 파이썬에서는 ***하나의 변수***에 여러 개의 자료를 저장하는 두 가지 방법을 사용
  • 여러 개의 자료가 순서가 있을 때에는 ***리스트(list)***
  • 여러 개의 자료가 이름이 있을 때는 ***딕셔너리(dictionary)***

2. 자료의 순서만 가지는 리스트 자료형

  • 리스트 자료형에는 여러개의 자료를 순서에 따라 저장
  • 리스트변수 = [자료1, 자료2, 자료3 ...]

3. 인덱싱

  • 리스트 자료형 변수에서 특정한 자료를 꺼내려면 익덱싱을 함
  • 이 때 자료의 순서를 뜻하는 숫자를 인덱스(index)라고 함.

4. 자료 이름만 가지는 딕셔너리 자료형

  • 딕셔너리변수 = {자료이름1: 자료값1, 자료이름2: 자료값2, 자료이름3: 자료값3}
  • 딕셔너리 자료형 변수에도 인덱싱이 가능하다.
b = {"math": 88, "english": 90, "history": 100}
b
# 결과 : {'math': 88, 'english': 90, 'history': 100}

# 딕셔너리 인덱싱
b["math"]
# 결과 : 88

(b['math'] + b['history']) / 2
# 결과 : 94.0

5. 리스트와 딕셔너리에 들어가는 자료의 자료형

  • 리스트 변수에는 같은 자료형 뿐만이 아니라, 다른 자료형도 담을 수 있다
  • d = [1, 3.14, "pi"]
    d[0]
    # 결과 : 1
    
    # 심지어 리스트 변수에 또 다른 리스트 변수나 딕셔너리 변수를 넣을 수 있다.
    e = [[1, 10], [2, 20]]
    e[0]
    # 결과 : [1, 10]
    
    e[0][0]
    # 결과 : 1
    
    f = [{0: 0, 1:10}, {0: 1, 1: 2}]
    f[0]
    # 결과 : {0: 0, 1: 10}
    
    f[0][1]
    # 결과 : 10

2.9 파이썬에서 리스트 자료형 다루기

 

1. 자료의 개수 : 리스트 변수에 자료가 몇 개 들어가는 지 알기 위해선 len

a = [1, 2, 3]

len(a)
# 결과 : 3

2. 수열 생성하기

  •  0부터 n-1까지 1씩 증가하는 n개의 숫자를 가진 수열 리스트는 range 명령으로 생성
  •  pyhton 2 버전 range 만 사용하면 되지만
  •  pyhton 3 버전에서는 range 명령으로 만들거 진 값을 list 명령으로 사용하여 명시적으로 리스트로 바꾸어야 함
    b = list(range(10))
    print(b)
    
    c = list(range(1, 10 + 1))
    print(c)
    
    d = list(range(1, 10, 3))
    print(d)
    
    #결과
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    [1, 4, 7]​
     

3. 값을 바꾸기

  • 특정한 원소의 값을 다른 값으로 바꾸는 것을 갱신(update)라고 함.
  • d[0] = 100
    d
    
    # 정답 : [100, 4, 7]

4. 자료 추가하기

- 리스트 변수 마지막에 자료를 더 추가하려면 append 메서드를 사용.
- 메서드란 변수 다음에 점을 찍고 쓰는 명령.

e = list(range(4))
print(e)
e.append(4)
print(e)
e.append(10)
print(e)

# 정답
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 10]

5. 자료 삭제하기

- 하나를 삭제하려면 del 명령 사용

f = list(range(5))
print(f)
del f[0]
print(f)

# 정답 : 
[0, 1, 2, 3, 4]
[1, 2, 3, 4]

6. 슬라이싱

- 특정 범위의 자료를 모두 가져오고 싶다면 슬라이싱 사용

g = list(range(20))
print(g)

print(g[0:5])
print(g[10:15])


# 결과
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 2, 3, 4]
[10, 11, 12, 13, 14]

7. 역 인덱싱(음수 인덱싱)

- 가장 뒤의 원소는 0이 아닌 -1이다.

 

8. 복수 할당

- 리스트의 각 원소값을 여러개의 변수에 나누어 넣고 싶으면 쉼표를 사용하여 사용.

g = [1, 2, 3]
g1, g2, g3 = g

print(g1)
print(g2)
print(g3)

# 정답
1
2
3

😢👍 2.10 리스트와 반복문을 사용하여 계산하기

 

1. 리스트와 반복문을 사용하여 계산하기

- 반복문은 리스트 자료형 변수를 대상으로 여러 가지 계산을 할 때 많이 사용
- 예를 들어 10번의 시험 성적을 담고 있는 a라는 변수가 있을 때, 평균 성적을 구하는 것

a = [90, 92, 33, 55, 77, 86, 84, 93]
a
len(a)

# 결과 : 8

sum = 0
for i in range(len(a)):
    sum += a[i]
    
print(sum)
ave = sum / len(a)
print(ave)

# 결과 : 
610
76.25

# 만약 학생이 두명이고 일 때
s = []
a1 = [90, 85, 95, 80, 90, 100, 85, 75, 85, 80]
a2 = [95, 90, 90, 90, 95, 100, 90, 80, 95, 90]
for i in range(len(a1)):
    s.append(a1[i] + a2[i])
    
s

# 결과 : 
[185, 175, 185, 170, 185, 200, 175, 155, 180, 170]

2. 리스트의 원소를 직접 반복문에서 사용하기

- 지금까지는 for 반복문을 사용할 때 

- range 명령으로 리스트에 적용할 익덱스 정수를 만들어서 리스트의 원소 값을 찾았음
- 하지만 for 반복문에서 리스트의 원소를 직접 뽑아 카운터 변수에 넣을 수도 있다.

# 지금까지 반복문을 사용해 온 range 명령은 
# 사실 리스트를 만드는 명령

list(range(5))

# 결과 : 
[0, 1, 2, 3, 4]

# 따라서 다음 코드는 
for i in range(5):
    print(i)
    
# 다음과 같다.
for i in [0, 1, 2, 3, 4]:
    print(i)
    
# 따라서 가장 위에서 한 학생의 평균 계산 코드는
# 다음 코드와 동일
print(a)
# 결과 : [90, 92, 33, 55, 77, 86, 84, 93]

sum = 0
for ai in a:
    sum = sum + ai
ave = sum / len(a)
ave
# 결과 : 75.25

3. 😢enmerate 함수

- 때로는 반복문에 정수 인덱스가 필요할 때도 있음
- 예를 들어 반복문에서 appned 메서드를 쓰면 계산 속도가 저하
- 이때는 미리 저장 공간을 만들어 놓고 해당 위쳉 계싼 결과를 갱신해야 함.
- 이때 enumerate 명령을 쓸수 있다.
- enumerate 명령은 리스트의 원소를 반복하면서
- 동시에 인덱스 값도 생성한다.

for i, e in enumerate(["a", "b", "c"]):
    print("i = %d, e = %s" % (i, e))
    
# 결과 : 
i = 0, e = a
i = 1, e = b
i = 2, e = c

s = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
a1 = [90, 85, 95, 80, 90, 100, 85, 75, 85, 80]
a2 = [95, 90, 90, 90, 95, 100, 90, 80, 95, 90]
for i, (a1i, a2i) in enumerate(zip(a1, a2)):
    s[i] = a1i + a2i
s

# 결과 :
[185, 175, 185, 170, 185, 200, 175, 155, 180, 170]

4. 리스트의 리스트

- 학새이 5명이고 각 학생이 10번의 시험에 대한 성적을 가진다면?
- 다음과 같은 리스트의 리스트로 전체 시험 성적을 나타낼 수 있음.

# 👍 2중 for문 이해해 중요함!

X = [[85,  90,  20,  50,  60,  25,  30,  75,  40,  55],
     [70, 100,  70,  70,  55,  75,  55,  60,  40,  45],
     [25,  65,  15,  25,  20,   5,  60,  70,  35,  10],
     [80,  45,  80,  40,  75,  35,  80,  55,  70,  90],
     [35,  50,  75,  25,  35,  70,  65,  50,  70,  10]]
     
 sum = 0
num = 0
for i in range(len(X)):
    for j in range(len(X[i])):
        num = num + 1
        sum = sum + X[i][j]
sum / num

# 결과 : 52.7

5. 😢zip 함수

- zip 함수는 두 개의 리스트를 합쳐서 각 리스트 원소의 쌍을 원소로 가지는 하나의 리스트르 만든다.
- 파이썬 3에서는 명시적으로 list 명령을 사용해야 리스트가 된다.

a1
# 결과 : 
[90, 85, 95, 80, 90, 100, 85, 75, 85, 80]

a2
# 결과 : 
[95, 90, 90, 90, 95, 100, 90, 80, 95, 90]


a12 = list(zip(a1, a2))
a12

[(90, 95),
 (85, 90),
 (95, 90),
 (80, 90),
 (90, 95),
 (100, 100),
 (85, 90),
 (75, 80),
 (85, 95),
 (80, 90)]
# 이때 소괄호로 표시된 묶음은 튜플(tuple)이라고 함.
# 따라서 모든 학생의 두 과목 성적 합산을 구하는 코드는
# 다음과 같이 고칠 수 있음.

s = []
a1 = [90, 85, 95, 80, 90, 100, 85, 75, 85, 80]
a2 = [95, 90, 90, 90, 95, 100, 90, 80, 95, 90]
for a1i, a2i in zip(a1, a2):
    s.append(a1i + a2i)
s

# 결과 : 
[185, 175, 185, 170, 185, 200, 175, 155, 180, 170]

# zip 함수를 사용할 때
#리스트의 리스트 인수를 하나만 넣고 인수의 앞에
# * 기호를 붙이면 리스트 쌍으로 바꾼다.

a12

# 결과 : 
[(90, 95),
 (85, 90),
 (95, 90),
 (80, 90),
 (90, 95),
 (100, 100),
 (85, 90),
 (75, 80),
 (85, 95),
 (80, 90)]
 -----------------------------------------------------------------
 a21 = list(zip(*a12))
a21

# 결과 :
[(90, 85, 95, 80, 90, 100, 85, 75, 85, 80),
 (95, 90, 90, 90, 95, 100, 90, 80, 95, 90)]