본문 바로가기
파이썬/파이썬 완성

[파이썬] TIL4 : 리스트의 자료구조와 랜덤 모듈의 활용 / 중첩된 리스트와 2차원 자료 구조의 활용

by charlie-lyc 2021. 4. 17.
728x90
반응형

▣ 리스트의 자료 구조

리스트(List)는 자료 구조(Data structure) 중 하나로 다른 프로그래밍 언어에서 일반적으로 배열(Array)이라고 부르는 형태와 일치합니다. 주된 특징은 공통적인 특성을 가진 데이터들의 집합이며, 리스트를 구성하는 각 요소들의 순서에 의미가 있는 자료를 저장하는데 유용합니다.

 

1. 예시

예를 들어 미국을 구성하고 있는 주(State) 들 가운데 미합중국 연방에 가입한 순서대로 몇 개의 주를 나열해 보면 아래와 같습니다.

 

states_of_usa = ['Delaware', 'Pencilvania', 'New Jersey']

 

2. 요소의 값

위의 예시에서 리스트를 구성하고 있는 개별 요소에 접근하기 위해서 각 요소가 가지고 있는 인덱스(Index) 값을 이용하여 아래와 같이 표기합니다.

 

states_of_usa = ['Delaware', 'Pencilvania', 'New Jersey']

print(states_of_usa[0])
print(states_of_usa[1])
print(states_of_usa[2])

 

🖥 코드 및 실행 결과

 

이때 주의해야 할 점은 첫 번째 요소의 인덱스 값이 0이라는 것입니다. 그리고 ' - ' 부호를 이용해서 마지막 요소부터 거꾸로 개별 요소에 접근할 수도 있습니다. 즉 리스트의 마지막 요소의 인덱스 값은 -1 입니다.

 

states_of_usa = ['Delaware', 'Pencilvania', 'New Jersey']

print(states_of_usa[-1])
print(states_of_usa[-2])
print(states_of_usa[-3])

 

🖥 코드 및 실행 결과

 

 

3. 요소를 수정

리스트의 요소에 다른 값을 할당하여 기존의 값을 바꿀 수 있습니다.

 

states_of_usa = ['Delaware', 'Pencilvania', 'New Jersey']

states_of_usa[1] = 'Pennsylvania'
print(states_of_usa)

 

🖥 코드 및 실행 결과

 

 

4. 요소를 추가

리스트의 메서드 append() 를 이용하여 리스트의 오른쪽 끝에 개별 요소를 추가할 수 있습니다.

 

states_of_usa = ['Delaware', 'Pennsylvania', 'New Jersey']

states_of_usa.append('Georgia')
print(states_of_usa)

 

🖥 코드 및 실행 결과

 

 

5. 리스트를 추가(연장)

리스트의 메서드 extend() 를 이용하여 리스트의 오른쪽에 다른 리스트를 이어 붙여 연장할 수 있습니다.

 

states_of_usa = ['Delaware', 'Pennsylvania', 'New Jersey', 'Georgia']

states_of_usa.extend(['Connecticut', 'Massachusetts'])
print(states_of_usa)

 

🖥 코드 및 실행 결과

 

 

※ 메서드(Method) : 클래스 기반(Class-based) 프로그래밍 언어(Programming language)인 파이썬은 클래스에서 정의된 다양한 기능을 가진 함수들이 인스턴스 객체로 상속되어 객체의 메서드로 사용됩니다. 당장 이해하기 어렵지만, 단편적으로 설명하자면 파이썬은 '리스트(List)'라는 미리 정의된 '클래스(Class)'를 내장하고 있고, 클래스 생성자(Constructor)를 이용(위에서는 생성자가 아니라 [ ] 기호를 이용)하여 리스트의 '객체'(위에서는 states_of_usa)를 생성합니다. 이때 클래스에서 정의된 유용한 함수들은 새롭게 생성된 객체에서도 그대로 사용할 수 있는데 이를 메서드라고 합니다. 즉, 위에서 이용한 append() 나 extend()는 이미 리스트 클래스에서 정의된 것을 가져와 사용하는 것입니다.

 


 

 랜덤 모듈(Random Module)

코딩을 할 때 필요한 모든 기능을 제로 베이스에서 새롭게 정의하여 작업하는 것은 간단한 일이 아닙니다. 이 것은 마치 자동차 부품 중에 모터가 고장 났다고 톱니 바퀴부터 깎아서 모터를 만드는 것과 마찬가지입니다. 그래서 미리 준비해둔 모터를 찾아 교체하듯이 필요할 때  불러와 활용할 수 있는 미리 작성된 파일을 준비해 두는데 이것을 파이썬에서 모듈(Module)이라고 합니다. 특히 코드가 길어질수록 용이한 유지보수를 위해 모듈화 하는 작업은 꼭 필요합니다.

 

1. 모듈 불러오기

모듈을 불러 올 때는 import 라는 예약어(Reserved word)를 사용합니다. 

 

import random

 

2. 모듈 이용하기

모듈을 불러올 때 적용했던 이름을 먼저 작성하고 '. (dot)' 기호를 통해서 함수(Function)나 속성(Attribute)을 이용할 수 있습니다. 

 

3. 임의의 정수 얻기

랜덤 모듈의 randint() 함수를 이용하여 특정 범위 내에서 임의의 정수를 얻을 수 있습니다.

 

import random

random_integer = random.randint(1, 10)
print(f'Random integer between 1 and 10 : {random_integer}')

 

위의 코드를 여러번 실행해 보면, 실행할 때마다 값이 달라지고 그 값은 1 이상 10 이하의 정수임을 알 수있습니다. 즉 인자로 입력한 1과 10이라는 정수가 범위에 포함됩니다.

 

🖥 코드 및 실행 결과

 

 

4. 임의의 실수 얻기

랜덤 모듈의 random() 함수를 이용하여 0 이상 1 미만의 임의의 실수를 얻을 수 있습니다.

 

import random

random_float = random.random()
print(f'Random float 0 and 1 : {random_float}')

 

🖥 코드 및 실행 결과

 

 

5. 임의의 실수 활용하기

위에서 익힌 임의의 실수를 얻는 방법을 활용해서 특정 범위 내의 수를 얻을 수 있습니다.

예를 들어서 0 이상 5 미만의 임의의 실수를 얻고자 한다면 아래와 같이 랜덤 모듈의 random() 함수를 활용할 수 있습니다.

 

import random

random_number05 = random.random() * 5
print(f'Random float 0 and 5 : {random_number05}')

 

🖥 코드 및 실행 결과

 

 

6. 실습 -

친구들과 동전 던지기 게임을 하고 싶은데 동전이 없어서 동전의 앞면과  뒷면을 임의로 정해주는 프로그램으로 만들고자 합니다. 어떻게 만들까요?

 

Which side of the coin?
<앞면> 또는 <뒷면>

우선 유사 코드를 작성해 보겠습니다.

# (동전의 뒷면과 앞면에 각각 임의로 0과 1이라는 숫자를 지정)

# print 동전 어느 면인가요?

# 변수 = randint 0 에서 1
# if 변수의 값 == 0 이면
  # print 뒷면
# else
  # print 앞면  

 

⌨️ 파이썬 온라인 컴파일러



 

7. 실습 - ②

친구들과 점심 식사를 하고 누가 점심을 살 것인지 제비뽑기 게임을 하기로 했습니다. 그런데 마땅한 도구가 없어 친구들의 이름을 나열하여 입력하면 임의로 한 명을 선택해주는 프로그램을 만들고자 합니다. 어떻게 만들까요?

참고로 입력되는 친구들의 이름은 하나의 연속된 문자열로 입력되고, 이름과 이름 사이에는 일정한 간격(스페이스바 한 칸)이 있으며, 이 문자열을 끊어서 리스트로 변환하기 위해 문자열의 메서드 split() 를 이용합니다.

 

Friends' names are : <이름1 이름2 이름3 ... >
Contgrats! <이름>!

우선 유사 코드를 작성해 보겠습니다.

# 변수 = input 친구들 이름 문자열 
# 이름 리스트 = split 친구들 이름 문자열

# 임의의 인덱스 = randint 이름 리스트의 인덱스 범위
# 친구 이름 = 이름 리스트[임의의 인덱스]
# print 점심값 계산할 친구 이름

 

※ 힌트 : 위의 유사 코드를 본 코딩으로 옮길 때 주의해야 할 점은 참여하는 친구들의 인원수에 따라 이름 리스트의 길이가 달라지고 그에 따라서 임의로 얻어야 할 인덱스의 범위 또한 달라집니다.

 

※ 추가 실습 : 위의 유사 코드와 같이 코딩해 보았다면 이번에는 랜덤 모듈의 choice() 함수를 이용해서 시도해 보길 바랍니다.

 

⌨️ 파이썬 온라인 컴파일러


 


반응형

 

 중첩된 리스트와 2차원 자료 구조

리스트 안에 리스트가 있는 자료 구조를 중첩된 리스트(Nested list)라고 하며, 이때 내부 리스트의 길이가 일정하게 반복되면 사각형 형태의 2차원 구조 리스트(2-Dimensional list)를 생성할 수 있습니다.

 

1. 예시

fruits = ['Avocado', 'Banana', 'Cherry']
vegetables = ['Asparagus', 'Beans', 'Carrot']

print([fruits, vegetables])
print()

print(fruits)
print(vegetables)

 

🖥 코드 및 실행 결과

 

 

2. 중첩 리스트 펼치기

위의 예시에서 내부 리스트의 요소들을 펼쳐서 하나의 리스트로 만들 수 있는 방법 몇 가지에 대해 살펴보겠습니다.

 

  ① 리스트 메서드 extend() 이용

fruits = ['Avocado', 'Banana', 'Cherry']
vegetables = ['Asparagus', 'Beans', 'Carrot']

fruits.extend(vegetables)
print(fruits)

 

🖥 코드 및 실행 결과

 

  ② + 기호 이용

fruits = ['Avocado', 'Banana', 'Cherry']
vegetables = ['Asparagus', 'Beans', 'Carrot']

food = fruits + vegetables
print(food)

 

🖥 코드 및 실행 결과

 

  ③ * 기호 이용

fruits = ['Avocado', 'Banana', 'Cherry']
vegetables = ['Asparagus', 'Beans', 'Carrot']

food = [*fruits, *vegetables]
print(food)

 

🖥 코드 및 실행 결과

 

 

3. 행렬 매트릭스 적용

2차원 리스트에는 행렬 매트릭스의 개념을 적용할 수 있습니다. 이 것은 마치 행과 열의 좌표로 이루어진 지도와 같은 역할을 합니다. 즉, 중첩 리스트의 모든 요소는 '[행 인덱스][열 인덱스]'의 형태로 접근이 가능합니다. 

fruits = ['Avocado', 'Banana', 'Cherry']
vegetables = ['Asparagus', 'Beans', 'Carrot']
food = [fruits, vegetables]

print(food[0][0])
print(food[0][1])
print(food[0][2])
print(food[1][0])
print(food[1][1])
print(food[1][2])

 

🖥 코드 및 실행 결과

 

 

4. 실습

보물찾기 놀이를 위해 보물을 숨기고자 합니다. 단 보물을 숨기는 위치는 입력된 좌표에 따라 격자무늬의 지도 위에 표시하여 남길 예정입니다. 보물지도는 아래와 같이 준비하였습니다. 어떻게 만들까요?

참고로 입력되는 좌표는 두 자리 정수 형태의 문자열로 입력되고, 자릿 수의 순서대로 각각 지도 좌표의 행(1~3)과 열(1~3)을 의미합니다. 그리고 보물을 숨긴 좌표에는 'X' 표시를 합니다.

 

row1 = ['☐', '☐', '☐']
row2 = ['☐', '☐', '☐']
row3 = ['☐', '☐', '☐']

map = [row1, row2, row3]
print(f'{map[0]}\n{map[1]}\n{map[2]}')

# Write code below

 

예를 들어 숫자 형태의 문자열 '32'를 입력할 경우 아래와 같이 지도가 출력됩니다.

Enter position : 32

우선 유사 코드를 작성해 보겠습니다.

# 변수 = input 두자리 정수(지도 좌표) 형태의 문자열

# 행 인덱스 = 변수(지도 좌표) 첫째 자리 - 1
# 열 인덱스 = 변수(지도 좌표) 둘째 자리 - 1

# map[행 인덱스][열 인덱스] = 보물 위치 표시
# print map 

 

⌨️ 파이썬 온라인 컴파일러


 


 

 에러

아래는 실습을 하는 과정 중에 만날 수 있는 에러와 예시입니다.

 

1. 인덱스 에러

fruits = ['Apple', 'Banana', 'Cherry']

# IndexError: list index out of range

print(fruits[3])

 


728x90
반응형

댓글