파이썬 자료구조/알고리즘 07 : 리스트와 튜플의 스캔과 역순으로 배열하기

728x90

배열의 모든 원소 스캔하기

 

enumerate() 함수는 인덱스와 원소를 짝지어 튜플로 꺼내는 내장함수이다.

 

range()와의 비교

x = ['a', 'b', 'c', 'd']
for i in range(len(x)):
    print(f'x[{i}] = {x[i]}')
x[0] = a
x[1] = b
x[2] = c
x[3] = d

 

x = ['a', 'b', 'c', 'd']

for tup in enumerate(x):
    print(tup)
    
for i, name in enumerate(x):
    print(f'x[{i}] = {name}')
(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
x[0] = a
x[1] = b
x[2] = c
x[3] = d

튜플 형태를 반환하므로 인덱스와 값을 따로 뽑아낼 수 있다.

 

range()의 경우 인덱스 값없이도 리스트를 스캔할 수 있다.

x = ['a', 'b', 'c', 'd']
for i in x:
    print(i)
a
b
c
d

 

 


리스트의 원소를 역순으로 정렬하기

리스트를 역순으로 재배열하는 알고리즘은 다음과 같다.

(튜플은 이뮤터블, 수정할 수 없으므로 역순으로 정렬할 수 없다.)

이와 같은 방법으로 원소를 재배열하면 교환 횟수는 원소 수에 2를 나눈 몫과 같다는 것을 알 수 있다.

그림처럼 원소 수가 홀수가 되는 경우에는 가운데 원소를 교환할 필요는 없다.

 

a에서 0번 인덱스는 7번과,

b에서 1번 인덱스는 6번과,

c에서 2번 인덱스는 5번과..

같은 방식으로 교환이 이루어 진다.

a라는 배열의 원소 수가 n개 일때, 맨 마지막 인덱스의 값은 a[n-1]과 같으므로

for i in range(n // 2):
    a[i], a[n - i - 1] = a[n - i - 1], a[i]

와 같은 방법으로 원소를 역순으로 배열할 수 있다.

 

이를 함수를 이용해서 코드를 짜면 다음과 같다.

from typing import MutableSequence


def reverse_array(a: MutableSequence) -> None:
    n = len(a)
    for i in range(n // 2):
        a[i], a[n - i - 1] = a[n - i - 1], a[i]

if __name__ ==  '__main__':
    num = int(input('원소의 개수 입력 : '))
    lst = []
    for i in range(num):
        lst.append(int(input(f'lst[{i}]의 값을 입력 : ')))
        
    reverse_array(lst)
    
    print('len을 역순으로 출력함')
    for i in range(num):
        print(f'lst[{i}] = {lst[i]}')
원소의 개수 입력 : 5
lst[0]의 값을 입력 : 1
lst[1]의 값을 입력 : 2
lst[2]의 값을 입력 : 3
lst[3]의 값을 입력 : 4
lst[4]의 값을 입력 : 5
len을 역순으로 출력함
lst[0] = 5
lst[1] = 4
lst[2] = 3
lst[3] = 2
lst[4] = 1

 

리스트는 reverse()함수나 [::-1]을 활용하는 방법으로도 역순으로 정렬할 수 있다.

 

x.reverse()    # 리스트 x의 원소를 역순으로 정렬. 반환X

특정한 값을 받지 않고 그냥 리스트를 역순으로 정렬하기 때문에 변수에 할당하는 방법으로는 사용할 수 없다.

 

lst = [1, 2, 3, 4, 5]
lst.reverse()
print(lst)
[5, 4, 3, 2, 1]

 

lst = [1, 2, 3, 4, 5]
new_lst = lst.reverse()
print(new_lst)
print(lst)
None
[5, 4, 3, 2, 1]

 

다만 reversed()함수의 경우 새로운 이터러블 객체를 생성하므로 reversed() 함수가 반환하는 이터러블 객체를 list() 함수에 넘기고 새로운 리스트를 생성해야 한다.

lst = [1, 2, 3, 4, 5]
new_lst = list(reversed(lst))
print(new_lst)
print(lst)
[5, 4, 3, 2, 1]
[1, 2, 3, 4, 5]

 

728x90