리스트(List)

타키탸키·2021년 1월 11일
0

Python 입문하기

목록 보기
7/14

지난 시간에는 숫자형, 문자열, 불린 자료형을 배웠습니다. 이외에도 Python의 자료형은 참 다양한데요. 이번 시간에는 리스트라는 자료형을 함께 배워보겠습니다.

📋 리스트(List)

지금까지 변수에는 단 하나의 값을 지정했습니다. 그런데 여러 개의 값을 하나의 변수에 넣고 싶다면 어떻게 해야할까요? 리스트를 활용하면 됩니다.

# 리스트
nums = [1, 2, 3, 4, 6, 12]

이건 12의 약수를 가지고 있는 리스트입니다. 리스트는 대괄호로 값을 묶어주고 쉼표로 나눕니다. 이 리스트는 정수형으로 이루어져 있고 nums라는 변수에 저장되었습니다. 문자열로 된 리스트도 한 번 볼까요?

alphabets = ["a", "b", "c", "d", "e"]

이 리스트는 문자열을 담고 있고 alphabets라는 변수에 저장되었습니다. 위 리스트를 nums 리스트, 아래 리스트를 alphabets 리스트라고 부르겠습니다. 리스트 속 값들을 리스트의 요소라고 합니다.

print(nums)
print(alphabets)
[1, 2, 3, 4, 6, 12]
["a", "b", "c", "d", "e"]

❗ 인덱스

리스트의 이름을 print()문으로 호출하면 콘솔에 이름을 제외한 리스트가 그대로 출력됩니다. 만약 리스트 속 요소를 하나하나 끄집어 내고 싶으면 어떻게 해야할까요?

리스트에서 요소의 위치인덱스(index)라고 하고 인덱스를 통해 요소를 가져오는 것인덱싱(indexing)이라고 합니다. 인덱싱을 하기 위해서는 리스트 이름과 대괄호를 쓰고 가져오고 싶은 요소의 인덱스를 쓰면 됩니다.

print(alphabets[1])
b

alphabet 리스트의 첫번째 값인 "a"를 출력하고 싶어 1을 적었는데 두번째 값인 "b"가 나왔습니다. 왜 그런 걸까요? 사실 Python에서는 인덱스가 0부터 시작됩니다. 따라서, "a"의 인덱스는 0번이죠.

❗ 인덱스 연산

지금까지 배운 내용을 응용해볼까요? 만약 nums의 요소 2와 4를 더하려면 어떻게 해야 할까요? 우선 2는 1번 인덱스, 4는 3번 인덱스에 있습니다. 인덱싱을 통해 두 값을 가져온 후 이를 더해주면 됩니다.

print(nums[1] + nums[3])
6

만약 인덱스 때문에 값이 헷갈린다면 변수를 활용해 볼 수 있습니다.

num1 = nums[1]
num2 = nums[3]

print(num1 + num2)
6

❗ 인덱스 범위

nums 리스트에는 6개의 요소가 있으니 인덱스는 0부터 5까지 있습니다. 만약 인덱스 6의 값을 불러오면 어떻게 될까요? 오류가 납니다. 오류 메세지에는 '인덱스가 범위를 벗어났다'라는 내용이 나옵니다.

그렇다면 nums 리스트에서 우리가 쓸 수 있는 인덱스는 딱 5까지뿐일까요? Python에는 '-(마이너스) 인덱스'라는 개념이 있습니다. 첫번째 요소의 인덱스는 0이기 때문에 리스트의 맨 마지막 요소의 인덱스는 -1이 됩니다. 마지막에서 두번째 요소의 인덱스는 -2가 되고 맨 첫번째 요소의 인덱스는 -6이 되죠.

print(nums[-1])
print(nums[-2])
print(nums[-6])
12
6
1

인덱스 6과 마찬가지로 -7 또한 범위를 벗어났다는 오류가 나옵니다. 따라서, nums의 인덱스는 -6부터 5가 되는 셈이죠.

❗ 리스트 슬라이싱

이번에는 리스트 슬라이싱(list slicing)이라는 개념을 활용해서 여러 개의 요소를 한꺼번에 가져와 보겠습니다.

nums[0:3]

리스트 슬라이싱의 역할은 인덱스를 일부를 통째로 잘라서 가져오는 것입니다. 리스트 슬라이싱은 대괄호와 인덱스, 콜론으로 구성되어 있습니다. 위 코드에서는 인덱스를 0부터 2까지 자릅니다. 그 결과는 다음과 같습니다.

[1, 2, 3]

주의해야 할 것은 코드에서는 3이라는 숫자를 적었지만 인덱스는 그 앞인 2까지만 출력된다는 점입니다.

print(nums[3:])

만약 콜론 뒤에 아무 수도 넣지 않으면 3에서부터 리스트의 마지막 인덱스까지 불러옵니다.

[4, 6, 12]

반대로 처음에 숫자를 적지 않고 콜론과 숫자를 쓰면 맨 앞에서부터 숫자 바로 전 인덱스까지의 요소가 들어간 리스트를 불러옵니다.

print(nums[:3])
[1, 2, 3]

한 번 슬라이싱한 리스트를 변수에 넣고 그 리스트 안의 요소를 불러올 수도 있습니다.

list_new = nums[:3]
print(list_new[1])

슬라이싱한 리스트의 인덱스 1에는 2라는 숫자가 있습니다. 따라서, 콘솔에 출력되는 숫자는 2입니다.

❗ 요소 변경하기

마지막으로 리스트에 있는 요소를 바꿔보겠습니다.

nums[1] = 8

위 코드는 지정 연산자의 오른쪽에 있는 정수 8을 인덱스 0에 저장합니다. 이후, nums 리스트를 다시 출력하면 다음과 같은 결과가 나옵니다.

[1, 8, 3, 4, 6, 12]

조금만 더 응용해봅시다.

nums[1] = nums[1] + nums[2]

우항부터 볼까요? 인덱스 1의 값은 2, 인덱스 2의 값은 3입니다. 두 수를 더하면 5가 나옵니다. 정수 5가 새로이 0번 인덱스에 저장되는 것이죠. 그래서 다시 한 번 리스트를 출력하면 다음과 같이 나옵니다.

[1, 5, 3, 4, 6, 12]

📋 리스트 함수

다음으로 리스트에서 사용할 수 있는 함수들을 보겠습니다. 우선 리스트 하나를 정의하겠습니다.

nums = []

❗ len 함수

첫번째로 배워볼 리스트 함수는 'len'입니다. len은 리스트에 몇 개의 요소가 있는지 알고 싶을 때 사용하는 함수입니다. len은 길이를 뜻하는 영어 단어 length의 약어입니다.

print(len(nums))

print 함수처럼 괄호 안에 리스트 이름을 적으면 됩니다. 현재 nums 리스트에는 아무 요소도 없기 때문에 0이 출력됩니다.

❗ append 함수

이번에는 리스트에 요소를 추가해보겠습니다. 이때 필요한 함수는 'append'입니다. append의 사용법을 볼까요?

nums.append(4)

리스트명 뒤에 점을 찍은 후 append를 입력합니다. 그 다음 괄호를 열고 안에 추가하고 싶은 값들을 넣어주면 됩니다.

이후 nums 리스트를 출력하면 [4]가 출력됩니다. 이번에는 정수 7과 3을 추가로 넣어주겠습니다.

nums.append(7)
nums.append(3)

위 코드를 실행하면 [4, 7, 3]이 출력됩니다. 이처럼 append를 사용하면 새로운 값을 리스트의 맨 오른쪽에 추가해줍니다. 이때 len함수를 호출하면 3이 출력됩니다.

❗ extend 함수

만약 여러 개의 값을 한꺼번에 넣고 싶다면 어떻게 해야할까요? 그럴 때는 extend 함수를 사용하면 됩니다.

nums.extend([2, 8, 6])
print(nums)
[4, 7, 3, 2, 8, 6]

❗ del 함수

이번에는반대로 요소를 제거해봅시다. 요소를 제거할 때 쓰는 함수는 'del'로 영어 단어 delete의 약어입니다.

nums = [1, 2, 3, 4, 6, 12]
del nums[2]

우선 del을 쓰고 리스트명을 적은 후 제거하고 싶은 요소의 인덱스를 적습니다. print() 함수에 넣고 결과를 봅시다.

[1, 2, 4, 6, 12]

원래 2번 인덱스에 있던 3이 없어졌습니다. 이제부터 3의 오른쪽에 있던 모든 값들이 하나씩 앞으로 당겨집니다.

❗ insert 함수

이번에는 원하는 인덱스에 임의의 숫자를 넣어보겠습니다. 이때는 insert를 사용합니다. append와 마찬가지로 리스트명 뒤에 점을 찍고 insert함수를 적습니다.

nums.insert(3, 42)

이처럼 insert의 파라미터는 두 가지가 필요합니다. 하나는 인덱스 번호, 다른 하나는 인덱스에 들어갈 값입니다.

append와 insert의 차이원하는 곳에 수를 넣을 수 있냐 없냐 인데요. 무조건 오른쪽 끝에 새로운 수를 추가하는 append는 '추가 연산'이고 원하는 곳에 값을 넣는 insert는 '삽입 연산'이라고 합니다. 위 코드를 실행해볼까요?

[1, 2, 3, 42, 4, 6, 12]

3번 인덱스에 42가 들어갔으며 42의 오른쪽 값들은 모두 우측으로 한 칸씩 밀려났습니다.

📋 리스트 정렬

nums = [4, 1, 6, 3, 5, 7, 2]

리스트 nums의 요소는 랜덤한 순서로 정렬되어 있습니다. 이 리스트를 오름차순 혹은 내림차순으로 정렬하려면 어떻게 해야할까요?

리스트를 정렬하는 함수에는 sortsorted가 있습니다. 각각 어떻게 다른지 한 번 볼까요?

❗ sorted

우선 sorted를 봅시다.

list_new = sorted(nums)

sorted를 사용하면 리스트가 새롭게 정렬됩니다. 이전 리스트와의 차이를 보기 위해 새로운 리스트를 변수에 저장했습니다. 이를 출력하면 다음과 같은 결과가 나옵니다.

[1, 2, 3, 4, 5, 6, 7]

요소들이 오름차순으로 정렬된게 보이시나요? 만약 내림차순으로 정렬하고 싶으면 어떻게 해야 할까요? sorted에 두 번째 파라미터 위치에 'reverse=True'를 넣어주면 됩니다.

list_new = sorted(nums, reverse=True)

이때 다시 한번 원래의 리스트명을 print()로 호출하면 기존의 리스트가 나옵니다. sorted는 기존의 리스트를 건드리지 않고 정렬된 새로운 리스트를 만들어서 리턴하기 때문입니다.

❗ sort

이번에는 sort의 예시를 봅시다.

print(nums.sort())

보시다시피 sort는 리스트명 뒤에 점을 찍고 함수명을 쓰는 형태로 사용됩니다. 괄호를 붙이는 것도 잊지 마세요.

위 코드를 실행하면 None이 출력되는데요. 앞서 리턴값이 없을 때 None이 출력된다고 배웠습니다. sort는 아무것도 리턴하지 않기 때문에 None이 출력됩니다.

그렇다면 정렬된 리스트를 출력하고 싶을 땐, 어떻게 해야할까요? 기존에 리스트를 불러왔을 때처럼 리스트명만 입력하면 됩니다. 왜 그런 걸까요?

기존의 리스트를 건드리지 않았던 sorted와 달리 sort는 기존 리스트의 정렬을 바꿔버립니다. 따라서, 바뀐 리스트를 출력하고 싶으면 리스트명만 불러오면 되는 것이죠.

print(nums)
[1, 2, 3, 4, 5, 6, 7]

마찬가지로 내림차순을 하고 싶다면 sort의 괄호에 'reverse=True'를 넣어주면 됩니다.

📋 리스트 꿀팁

❗ 리스트에서 값의 존재 여부 확인하기

어떤 값이 리스트에 있는지 확인하려면 다음과 같이 하면 됩니다.

# value가 list_1의 요소인지 확인하는 함수

def list_in(list_1, value):
    i = 0
    while i < len(list_1):
        # list_1에서 value를 찾으면 True를 리턴
        if list_1[i] == value:
            return True
        i += 1
    # 만약 list_1에서 value를 찾지 못했다면 False를 리턴
    return False
    
# 테스트
nums = [1, 2, 3, 4, 6, 12]
print(list_in(nums, 3))
print(list_in(nums, 8))
True
False

사실 함수 자체는 코딩하기 어렵지 않습니다. 그러나 실무에서 너무 많이 쓰이는 함수이기 때문에 Python에는 이미 이 기능이 내장되어 있습니다. in이라는 키워드를 쓰면 쉽고 간단하게 함수의 요소 존재 여부를 확인할 수 있습니다.

nums = [1, 2, 3, 4, 6, 12]
print(3 in nums)
print(8 in nums)

반대로 리스트에 없는 값인지 확인하기 위해서는 not in을 사용하면 됩니다.

nums = [1, 2, 3, 4, 6, 12]
print(3 not in nums)
print(8 not in nums)
False
True

❗ Nested List

리스트 안에 또 다른 리스트를 넣을 수 있습니다. 리스트 안의 리스트Nested List라고 합니다.

# 두 번의 시험을 보는 수업
grade = [[94, 85], [93, 82]]

# 두 번째 학생의 성적
print(grade[1])

# 첫 번째 학생의 두 번째 시험 성적
print(grade[0][1])

# 두 번째 시험의 평균
print(grade[0][1] + grade[1][1] / 2)
[93, 82]
85
83.5

❗ reverse 메소드

리스트명.reverse()리스트 요소들의 순서를 거꾸로 배치합니다.

nums = [5, 6, 4, 2]
nums.reverse()
print(nums)
[2, 4, 6, 5]

❗ index 메소드

리스트명.index(a)는 리스트에서 a의 값을 가지고 있는 요소의 인덱스를 리턴합니다.

names = ["아이린", "웬디", "조이", "슬기", "예리"]
print(names.index("아이린"))
print(names.index("조이"))
0
2

❗ remove 메소드

리스트명.remove(a)는 리스트에서 첫번째로 a의 값을 가지고 있는 요소를 삭제합니다.

nums = [0, 1, 1, 2, 3, 5, 8, 13]
names.remove(1)
print(names)
[0, 1, 2, 3, 5, 8, 13]

* 이 자료는 CODEIT의 프로그래밍 기초 in Python 강의를 기반으로 작성되었습니다.
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글