[python] 리스트와 튜플 응용하기

리스트 조작하기

리스트에 요소를 추가하는 메소드는 3가지이다.

  • append: 요소 하나를 추가
  • extend: 리스트를 연결하여 확장
  • insert: 특정 인덱스에 요소 추가
a = [10, 20, 30]
a.append(500)
print(a)

# 리스트를 append하면 리스트 안에 리스트가 들어가서 중첩 리스트
a.append([1, 2, 3])
print(a)
print(len(a))

# 리스트에 요소를 여러 개 추가하려면 append를 여러번 쓸 수도 있겠지만,
# 추가할 요소가 많은 경우 번거롭기 때문에 extend를 이용
# extend(리스트) 하면 리스트 끝에 인자 리스트 연결해 확장
a.extend([4, 5, 6])
print(a)
print(len(a))

# insert(인덱스, 요소) 하면 특정 인덱스에 요소를 추가
# insert(0, 요소): 리스트의 맨 앞에 요소 추가
# insert(len(리스트), 요소): 리스트의 맨 뒤에 요소 추가
# 리스트 중간에 요소 여러개 넣으려면 슬라이스에 요소를 할당하면 된다.
a.insert(1, 1000)
print(a)

# 리스트에서 요소를 삭제하는 메소드는 2가지
# pop: 마지막 요소 또는 특정 인덱스의 요소를 삭제
# remove: 특정 값을 찾아서 삭제
a = [10, 20, 30, 40, 50]
a.pop()  # 마지막 요소 삭제
print(a)

a.pop(1)  # 인덱스 1의 요소 삭제
print(a)

del a[2]  # 인덱스 2의 요소 삭제
print(a)

a.extend([100, 100, 100])  # 리스트 끝에 100, 100, 100을 추가
a.remove(100)  # 값으로 요소를 삭제하면 제일 먼저 찾은 값만 삭제
print(a)

리스트로 스택과 queue를 구현할 수 있다.
append로 stack과 queue의 push를 담당
pop하면 stack의 삭제, pop(0)하면 queue의 삭제
또한, 파이썬은 deque를 지원

from collections import deque  # 콜렉션 모듈에서 deque를 import
a = deque([10, 20, 30])
print(a)
a.append(500)
print(a)
a.popleft()
print(a)
a.pop()
print(a)

리스트에서 index(값)은 특정 값의 인덱스를 구한다.
값이 여러개일 경우 처음 찾은 인덱스만 구한다.
없는 값을 찾는 경우는 ValueError가 나온다.

a = [10, 20, 30, 15, 20, 40]
print(a.index(20))

리스트에서 count(값)은 특정 값의 개수를 구한다.

print(a.count(20))

reverse()는 리스트에서 요소의 순서를 반대로 뒤집는다.

a.reverse()
print(a)

sort()또는 sort(reverse=False): 리스트의 값을 오름차순 정렬
sort(reverse=True): 리스트의 값을 내림차순 정렬

a.sort()
print(a)
# sorted(리스트)는 정렬된 새 리스트를 생성한다는 점에서 sort()와 차이가 있다.

clear()는 리스트의 모든 요소를 삭제한다.
del a[:]와 같이 슬라이스를 이용해도 된다.

a.clear()
print(a)

리스트(시퀀스 객체)에 내용이 있는지 확인하려면 if 리스트: 하면 된다.
리스트가 비어있을 경우에는 인덱스를 -1로 지정하여 인덱싱하면 오류가 나므로 if문으로 한번 걸러줘야 한다.

a.append(1)
if a:
    print(a[-1])

리스트의 할당과 복사

아래와 같이 하면 실제로 리스트는 한개이다.
a 와 b를 is 로 비교해보면 True가 나온다. 이름만 다를 뿐 같은 객체

a = [0, 0, 0, 0, 0]
b = a
if a is b:
    print('a is b')
b[2] = 99
print(a)  # 결과에 윗 줄의 영향이 있다.

리스트 a와 b를 완전히 두 개로 만드려면 copy 메소드로 모든 요소를 복사해야 한다.

b = a.copy()
if a is not b:
    print('a is not b')
if a == b:  # 이제 a와 b는 다른 객체이지만 내용은 여전히 같다.
    print('same contents')

for문에서 인덱스와 요소를 같이 가져오려면 enumerate(리스트)를 사용

a = [38, 21, 53, 62, 19]
for index, value in enumerate(a):
    print(index, value)

while 반복문으로 요소 출력하기

i = 0
while i < len(a):
    print(a[i])
    i += 1

리스트의 최소, 최대, 합계 구하기

가장 작은 수와 큰 수를 리스트를 순회하면서 구할 수 있다.

a = [38, 21, 53, 62, 19]
mn = a[0]
mx = a[0]
for i in a:
    if i < mn:
        mn = i
    if i > mx:
        mx = i
print(mn, mx)

또는 정렬을 통해서도 구할 수 있다.

a.sort()  # 오름차순 정렬하면
print(a[0])  # 제일 첫 원소가 최소
a.sort(reverse=True)  # 내림차순 정렬하면
print(a[0])  # 제일 첫 원소가 최대

파이썬에서는 min, max를 통해 리스트에서 가장 작은, 큰 값을 구할 수 있다.

print(min(a))
print(max(a))

요소의 합계 또한 리스트를 순회하며 구할 수 있다.

s = 0
for i in a:
    s += i
print(s)

파이썬에서는 sum을 통해 리스트의 요소의 합계를 구할 수 있다.

print(sum(a))

위에서 설명한 min, max, sum에는 리스트 뿐만 아니라 모든 반복 가능한 객체를 넣을 수 있다.
반복 가능한 객체란, 리스트, 튜플, 딕셔너리, 세트, range 등 여러 가지가 있다.

리스트 표현식

파이썬의 리스트가 특이한 점은 리스트 안에 for, if 문을 사용할 수 있다는 것.
리스트 안에 for, if 를 넣어 리스트를 생성하는 것을 list comprehension(리스트 표현식)이라고 한다.

# for문을 이용한 리스트 표현식
a = [i for i in range(10)]  # 0부터 9까지 숫자 생성해서 리스트 생성
print(a)

a = [i * 2 for i in range(10)]  # 0부터 9 까지 숫자 생성해서 i * 2를 하여 리스트 생성
print(a)

# if문을 이용한 리스트 표현식
# for문 뒤에 지정한다.
a = [i for i in range(10) if i % 2 == 0]
print(a)

# for문과 if문을 여러번 쓸 수도 있다.
a = [i * j for i in range(2, 10) if i % 2 == 0 for j in range(1, 10) if j % 2 != 0]
print(a)

리스트에 map 사용하기

map은 모든 반복 가능한 객체의 요소를 지정된 함수로 처리해주는 함수이다.
list(map(함수, 리스트))
tuple(map(함수, 튜플))

a = [1.2, 2.5, 3.7, 4.6]
a = list(map(int, a))
print(a)

a = list(map(str, range(10)))
print(a)

여태 input().split()으로 값을 여러 개 입력받고 다른 자료형으로 변환할 때도 map을 사용했는데,
input().split()의 결과가 문자열 리스트라서 map을 사용할 수 있었던 것이다.
(map이 반환하는 map 객체가 이터레이터라서 변수 여러개에 저장하는 언패킹이 가능했던 것)

a = input().split()  # 1 2 입력
print(a)  # ['1', '2'] 가 결과로 나온다.

m = map(int, input().split())  # 1 2 입력
print(m)
a = list(m)
print(a)  # map 객체를 이용하여 만든 리스트 [1, 2]

튜플 응용하기

튜플은 리스트와는 달리 내용을 변경할 수 없다.
따라서 내용을 변경하는 메소드는 사용할 수 없고, 요소의 정보를 구하는 메소드만 사용할 수 있다.

index(값) 은 튜플에서 특정 값의 인덱스를 구한다.
리스트에서와 마찬가지로 값이 여러개일 경우에는 처음 찾은 것의 인덱스만,
튜플에 없는 값을 인자로 넘겼을 때에는 ValueError가 나온다.

a = (38, 21, 53, 52, 19, 53)
print(a.index(21))

# for 문으로 요소를 출력하는 방법은 리스트와 같다.
for i in a:
    print(i, end=' ')
print()

# 튜플에서도 리스트와 마찬가지로 튜플 표현식을 사용할 수 있다.
a = tuple(i for i in range(10) if i % 2 == 0)
print(a)

# 튜플에 map을 사용하는 방법도 리스트와 같다.
a = tuple(map(str, a))
print(a)

# min, max, sum을 사용하는 방법도 리스트와 같다.
a = tuple(map(int, a))
print(min(a), max(a), sum(a))

Updated:

Leave a comment