본문 바로가기

Python/파이썬 - 기본을 갈고 닦자!

#11. List(리스트)(2) - 리스트 인덱싱, 리스트 슬라이싱

#11. List(리스트)(2) - 리스트 인덱싱, 리스트 슬라이싱

 

11. List(리스트)(2) - 리스트 인덱싱, 리스트 슬라이싱

## 1.list indexing(리스트 인덱싱) - 파이썬에서 리스트 인덱싱은 `-`(음수 인덱싱) 값도 허용합니다. - `-` 값은 역순으로도 인덱싱됩니다. - 다른 언어에…

wikidocs.net

더보기

1.list indexing(리스트 인덱싱)

  • 파이썬에서 리스트 인덱싱은 -(음수 인덱싱) 값도 허용합니다.
  • - 값은 역순으로도 인덱싱됩니다.
  • 다른 언어에서면 마지막열을 찾기위해 리스트의 길이를 구해서 찾아야 하지만, 파이썬은 -1만으로도 손쉽게 찾을 수 있습니다.
>>> s = 'show how to index into sequences'.split()
>>> s
['show', 'how', 'to', 'index', 'into', 'sequences']
>>> s[0]
'show'
>>> s[5]
'sequences'
>>> s[-1]
'sequences'
>>> s[-2]
'into'
>>> s[-6]
'show'

2. list slicing(리스트 슬라이싱)

  • 파이썬에서는 리스트를 자르는 특별한 문법을 제공합니다.
  • 사용법은 리스트변수[시작인덱스:종료인덱스:step] 입니다. 종료인덱스의 원소는 포함되지 않고 바로 앞 원소까지만 포함됩니다. step은 생략됩니다.
>>> s[1:4]
['how', 'to', 'index']
  • 음수 인덱싱도 슬라이싱에 사용할 수 있습니다.
>>> s[1:-1]
['how', 'to', 'index', 'into']
  • 시작인덱스부터 끝까지 포함시키려면 아래와 같이 입력합니다.
  • 리스트변수[시작인덱스:]
>>> s[3:]
['index', 'into', 'sequences']
  • 반대로 처음부터 특정인덱스까지 가져오기 위해서는 아래와 같이입력합니다.
  • 리스트변수[:종료인덱스]
>>> s[:3]
['show', 'how', 'to']
  • 위 두 예제를 합치면 처음 리스트 변수와 같습니다.
>>> s[:3] + s[3:] == s
True
  • 모든 값을 복사하여 새로운 list를 만들기 위해서는 아래와같이 입력합니다.
  • 리스트변수[:]
>>> full_slice = s[:]
>>> full_slice
['show', 'how', 'to', 'index', 'into', 'sequences']
  • 슬라이스를 통해 새롭게 만든 변수와 값은 같지만, 같은 변수는 아닙니다.
>>> full_slice == s
True
>>> full_slice is s
False
>>> 
  • 리스트를 복사하는 방법에는 두가지 방법이 더 있습니다.
>>> u = s.copy()
>>> v = list(s)
>>> u
['show', 'how', 'to', 'index', 'into', 'sequences']
>>> v
['show', 'how', 'to', 'index', 'into', 'sequences']
  • step을 사용해봅니다.
>>> s = 'show how to index into sequences'.split()
>>> s
['show', 'how', 'to', 'index', 'into', 'sequences']
>>> s[::2]
['show', 'to', 'into']
  • step을 활용하여 리스트를 reverse할 수 있습니다.
Copy>>> s = 'show how to index into sequences'.split()
>>> s
['show', 'how', 'to', 'index', 'into', 'sequences']
>>> s[::-1]
['sequences', 'into', 'index', 'to', 'how', 'show']

개념 문제

리스트 인덱싱

1. 파이썬에서 리스트 인덱싱의 장점 중 하나는 음수 인덱스를 사용할 수 있다는 점입니다. 음수 인덱스가 유용한 이유는 무엇인가요? 음수 인덱스의 기능을 설명하세요.

a) 리스트의 중간 값을 쉽게 찾을 수 있다.
b) 리스트의 길이를 계산하지 않고도 마지막 원소를 쉽게 참조할 수 있다.
c) 리스트의 첫 번째 원소를 반복적으로 사용할 수 있다.
d) 리스트를 정렬하지 않고도 역순으로 접근할 수 있다.

2. 리스트 elements가 ['a', 'b', 'c', 'd', 'e']일 때, elements[-3]는 어떤 값을 반환하나요?

a) 'a'
b) 'b'
c) 'c'
d) 'd'

더보기

1. b) 리스트의 길이를 계산하지 않고도 마지막 원소를 쉽게 참조할 수 있다.

2. c) 'c'

리스트 슬라이싱

3. 리스트 슬라이싱의 구문은 리스트변수[시작인덱스:종료인덱스:step]입니다. step을 생략하면 기본 값은 무엇인가요?

a) 0
b) 1
c) -1
d) 2

4. 리스트 numbers가 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]일 때, numbers[2:8:2]는 어떤 값을 반환하나요?

a) [2, 3, 4, 5, 6, 7]
b) [2, 4, 6, 8]
c) [2, 4, 6]
d) [3, 5, 7]

더보기

3. b) 1

4. c) [2, 4, 6]

리스트 인덱스와 슬라이싱의 차이점

5. 리스트 인덱스와 슬라이싱의 차이점을 설명한 것 중 올바르지 않은 것은?

a) 인덱스는 리스트의 특정 위치에 있는 하나의 요소를 참조한다.
b) 슬라이싱은 리스트의 특정 범위에 있는 여러 요소를 참조한다.
c) 인덱스를 사용할 때는 시작과 종료 위치를 지정해야 한다.
d) 슬라이싱은 시작 인덱스, 종료 인덱스, 그리고 단계(step)를 지정할 수 있다.

 

리스트 복사

6. 다음 중 리스트를 복사하는 방법이 아닌 것은?

a) new_list = old_list.copy()
b) new_list = list(old_list)
c) new_list = old_list[:]
d) new_list = old_list.reverse()

더보기

5. c) 인덱스를 사용할 때는 시작과 종료 위치를 지정해야 한다.

6. d) new_list = old_list.reverse()

리스트 슬라이싱 결과

7. 리스트 data가 [10, 20, 30, 40, 50, 60, 70, 80, 90]일 때, data[2:7:2]의 결과는?

a) [30, 50, 70]
b) [30, 50, 70, 90]
c) [20, 40, 60]
d) [30, 40, 50, 60, 70]

 

리스트 슬라이싱을 사용한 리스트 전체 복사

8.리스트 numbers를 슬라이싱하여 전체 복사하는 방법으로 올바른 것은?

a) new_numbers = numbers[:]
b) new_numbers = numbers[::]
c) new_numbers = numbers[0:]
d) 위의 모든 방법

 

리스트 인덱싱의 특징

9. 다음 중 리스트 인덱싱의 특징에 대한 설명으로 옳지 않은 것은?

a) 인덱스는 0부터 시작한다.
b) 음수 인덱스를 사용하여 리스트의 끝에서부터 요소를 참조할 수 있다.
c) 인덱스를 사용하여 리스트의 범위를 벗어난 요소를 참조하면 IndexError가 발생한다.
d) 인덱스를 사용하여 여러 요소를 동시에 참조할 수 있다.

더보기

7. a) [30, 50, 70]

8. d) 위의 모든 방법

9. d) 인덱스를 사용하여 여러 요소를 동시에 참조할 수 있다.

연속된 범위의 요소를 참조하기 위해서는 슬라이싱을 사용할 수 있습니다.

fruits = ['apple', 'banana', 'cherry', 'date', 'elderberry']

# 첫 번째부터 세 번째 요소까지 (인덱스 0, 1, 2)
subset_fruits = fruits[0:3]
print(subset_fruits)  # 출력: ['apple', 'banana', 'cherry']

혹은 특정 인덱스의 요소를 동시에 참조하기위해서 리스트 컴프리헨션을 사용할 수 있습니다.

fruits = ['apple', 'banana', 'cherry', 'date', 'elderberry']

# 첫 번째, 두 번째, 세 번째 요소를 선택 (인덱스 0, 1, 2)
indices = [0, 1, 2]
selected_fruits = [fruits[i] for i in indices]
print(selected_fruits)  # 출력: ['apple', 'banana', 'cherry']

특정 인덱스의 요소를 동시에 참조할때 'map' 함수를 사용하여 동일한 작업을 수행할 수 있습니다.

fruits = ['apple', 'banana', 'cherry', 'date', 'elderberry']

# 첫 번째, 두 번째, 세 번째 요소를 선택 (인덱스 0, 1, 2)
indices = [0, 1, 2]
selected_fruits = list(map(fruits.__getitem__, indices))
print(selected_fruits)  # 출력: ['apple', 'banana', 'cherry']

코딩 문제

1. 리스트 ['apple', 'banana', 'cherry', 'date', 'elderberry']를 선언하고, 인덱스를 사용하여 첫 번째 요소와 마지막 요소를 출력하는 코드를 작성하세요.

fruits = ['apple', 'banana', 'cherry', 'date', 'elderberry']
첫 번째부터 세 번째 요소까지의 인덱스를 사용하여 부분 리스트를 출력
더보기
fruits = ['apple', 'banana', 'cherry', 'date', 'elderberry']
# 첫 번째 요소와 마지막 요소를 출력
print(fruits[0])  # 출력: apple
print(fruits[-1]) # 출력: elderberry

2. 리스트 ['cat', 'dog', 'rabbit', 'hamster', 'parrot']를 선언하고, 슬라이싱을 사용하여 첫 번째부터 세 번째 요소까지의 부분 리스트를 출력하는 코드를 작성하세요.

animals = ['cat', 'dog', 'rabbit', 'hamster', 'parrot']
첫 번째부터 세 번째 요소까지 슬라이싱을 사용하여 부분 리스트를 출력
더보기
animals = ['cat', 'dog', 'rabbit', 'hamster', 'parrot']
# 첫 번째부터 세 번째 요소까지의 부분 리스트를 출력
sub_list = animals[0:3]
print(sub_list)

 

3. 리스트 [1, 2, 3, 4, 5, 6]를 선언하고, 슬라이싱을 사용하여 두 번째 요소부터 끝까지의 부분 리스트를 출력하는 코드를 작성하세요.

numbers = [1, 2, 3, 4, 5, 6]
두 번째 요소부터 끝까지의 부분 리스트를 출력
더보기
numbers = [1, 2, 3, 4, 5, 6]
# 두 번째 요소부터 끝까지의 부분 리스트를 출력
sub_list = numbers[1:]
print(sub_list)

4. 리스트 ['a', 'b', 'c', 'd', 'e', 'f']를 선언하고, 슬라이싱을 사용하여 리스트의 끝에서 세 번째 요소부터 시작하여 처음까지의 모든 요소를 역순으로 출력하는 코드를 작성하세요.

letters = ['a', 'b', 'c', 'd', 'e', 'f']
끝에서 세 번째 요소부터 처음까지의 모든 요소를 역순으로 출력
더보기
letters = ['a', 'b', 'c', 'd', 'e', 'f']
# 리스트의 마지막 두 요소를 제외한 나머지 부분을 가져옵니다.
modified_letters = letters[:-2]
print(modified_letters)
# modified_letters 리스트를 내림차순으로 정렬합니다.
modified_letters.sort(reverse=True)
print(modified_letters)
letters = ['a', 'b', 'c', 'd', 'e', 'f']
# 끝에서 세 번째 요소부터 처음까지의 모든 요소를 역순으로 출력
# letters[start:stop:step]
reversed_sub_list = letters[-3::-1]
print(reversed_sub_list)

 

  • start는 -3으로, 리스트의 뒤에서 세 번째 요소인 'd'를 가리킵니다.
  • stop이 지정되지 않았으므로, 리스트의 시작까지 계속됩니다.
  • step은 -1으로, 역순으로 이동합니다.
  • 슬라이싱에서 stop 인덱스는 해당 위치에서 멈추지만 그 위치의 요소는 포함되지 않습니다. 슬라이싱 구문은 start 인덱스부터 stop 인덱스 바로 앞까지의 요소들을 선택합니다.

5. 리스트 [10, 20, 30, 40, 50, 60, 70]를 선언하고, 슬라이싱을 사용하여 홀수 번째 요소들만 포함된 부분 리스트를 출력하는 코드를 작성하세요.

mix = [10, 20, 30, 40, 50, 60, 70]
홀수 번째 요소들만 포함된 부분 리스트를 출력
더보기
mix = [10, 20, 30, 40, 50, 60, 70]
# 홀수 번째 요소들만 포함된 부분 리스트를 출력
odd_elements = mix[::2]
print(odd_elements)