파이썬 자료구조 :: 리스트 list (*)
프로그래머스 기초 단계를 풀다보니 자료구조가 많이 부족해서 정리를 해볼려고 한다.
[ 리스트 list 정리편]
참고 사이트 : 제대로 파이썬 (위키독스)
list 특징
Sequence (순서)가 있어서, 인덱스로 값을 찾을 수 있다.
(Sequence : list, tuple / Non-Sequence : set, dict)
변경 가능한 객체(mutable)라서 생성한 후에도 수정하거나 제거, 추가가 가능
(mutable : list, dict, set / immutable : tuple, str )
list 선언
a = []
b = list()
c = [1, 2, 'Life', 'is']
d = [1, 2, ['Life', 'is']]
리스트를 선언하고, 값을 넣는 문제를 푸는 방법이 3가지가 있어서 정리해봄
① 정석 : 빈 리스트 선언하고, for문 돌리면서 하나씩 append해서 값 추가
def solution(start_num, end_num):
answer = []
for i in range(start_num, end_num+1):
answer.append(i)
return answer
② list [ ] 괄호 안에서 리스트 컴프리헨션
def solution(start_num, end_num):
return [i for i in range(start_num, end_num+1)]
def solution(start_num, end_num):
return list(range(start_num, end_num+1))
list 인덱싱, 슬라이싱
a[0], a[3]
a[0] + a[3]
a[ : 3], a[2 : 5], a[2 : ], a[ : ], a[-3 : ] ~부터 ~까지
a[-1], a[-3] 뒤에서 -n번째 출력
a[ : : 2 ] 2칸씩 스텝(간격)
a[ : : -1] 역순출력
이중 리스트 인덱싱
>>> a = [1, 2, 3, ['a', 'b', 'c']]
>>> a[0]
1
>>> a[-1]
['a', 'b', 'c']
>>> a[3]
['a', 'b', 'c']
>>> a[-1][0]
'a'
>>> a = [1, 2, ['a', 'b', ['Life', 'is']]]
>>> a[2][2][0]
'Life'
>>> a = [1, 2, 3, ['a', 'b', 'c'], 4, 5]
>>> a[2:5]
[3, ['a', 'b', 'c'], 4]
>>> a[3][:2]
['a', 'b']
list 연산하기
+ 더하기
리스트 더하기, 인덱스 요소 값 더하기 둘다 가능
a[3] + a[5]
[1, 2, 3] + [3, 4, 5]
a + b #각각 리스트
list + str는 오류가 나기때문에 주의
>>> a = [1, 2, 3]
>>> a[2] + "hi"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
list를 str로 형변환하거나, str를 list로 형변환해서 타입을 통일해야함
>>> str(a[2]) + "hi"
3hi
for 문으로 리스트를 돌릴때, 자주하는 실수이다.
### 오류남. 틀린 문법
arr = []
for i in range(5) :
if i % 2 == 0 :
arr += i
arr
arr += i 이 부분에서 i 는 int형인데, arr는 타입이 list라서 충돌이 생긴다.
list + int는 합쳐질 수 없기때문이다.
그래서 아래처럼 arr += [i] 로 합쳐야함 .
# 이렇게 해야함
arr = []
for i in range(5) :
if i % 2 == 0 :
arr += [i]
arr
* 반복하기
>>> a = [1, 2, 3]
>>> a * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
list 수정
>>> a = [1, 2, 3]
>>> a[2] = 4
>>> a
[1, 2, 4]
list 추가
추가하는 방법에는 2가지 방법이 있다.
① append ② insert
① list.append(value)
리스트의 가장 마지막 자리에 새로운 값을 추가한다.
>>> a = [1, 2, 3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
append 메서드 안에 리스트를 추가하면, 중첩된 리스트를 만들 수 있음
>>> a.append([5, 6])
>>> a
[1, 2, 3, 4, [5, 6]]
② list.insert(idx, value)
>>> a = [1, 2, 3]
>>> a.insert(0, 4)
>>> a
[4, 1, 2, 3]
list 삭제
삭제하는 방법에는 3가지 방법이 있다.
① del ② remove ③ pop
① del a[idx]
>>> a = [1, 2, 3]
>>> del a[1]
>>> a
[1, 3]
여러 요소를 삭제하고 싶으면,
del a[1]
del a[4]
이렇게 하나씩 하나씩 del 함수를 써서 삭제해야함
연달아 있는 요소라면, 리스트 슬라이싱 활용 가능
>>> a = [1, 2, 3]
>>> a[2] = 4
>>> a
[1, 2, 4]
② list.remove(value)
리스트에서 첫번째로 나오는 value 값을 삭제하는 함수. 하나만 삭제가 된다.
value값이 리스트에 여러개 있어도, 가장 처음에 나오는 값 하나만 삭제가 됨
>>> a = [1, 2, 3, 1, 2, 3]
>>> a.remove(3)
>>> a
[1, 2, 1, 2, 3]
③ list.pop(idx)
리스트의 idx 자리에 맞는 요소를 리턴하고, 삭제함
idx의 기본값은 공백 = 가장 마지막 자리 = list.pop() = 가장 마지막 요소 삭제
>>> a = [1, 2, 3]
>>> a.pop()
3
>>> a
[1, 2]
idx를 1로하면, list.pop(1) = list[1] 요소 삭제
>>> a = [1, 2, 3]
>>> a.pop(1)
2
>>> a
[1, 3]
list 정렬
역방향으로 정렬하는 방법에는 4가지 방법이 있다.
① sort ② sorted ③ reverse ④ 리스트 슬라이싱
① sort 메서드
list.sort(key=None, reverse=False)
① key (선택): 정렬의 기준을 제공하는 함수
② reverse (선택): boolen 타입, 기본값은 False로 오름차순, True는 내림차순
sort 메서드는 원본 리스트를 자체를 정렬해서, 원본 자체가 변경되는게 특징이다.
numbers = [5, 2, 8, 1, 6]
# 오름차순으로 정렬
numbers.sort()
print(numbers) # 출력: [1, 2, 5, 6, 8]
# 내림차순으로 정렬
numbers.sort(reverse=True)
print(numbers) # 출력: [8, 6, 5, 2, 1]
# 절댓값을 기준으로 정렬
numbers.sort(key=abs)
print(numbers) # 출력: [1, 2, 5, 6, 8]
원본은 유지하고 정렬한 리스트는 다른 곳에 저장하고 싶다면 sorted 함수를 사용해야 한다.
② sorted 함수
변수 = sorted(iterable, key=None, reverse=False)
② key (선택): 정렬의 기준을 제공하는 함수
③ reverse (선택): boolen 타입, 기본값은 False로 오름차순, True는 내림차순
numbers = [5, 2, 8, 1, 6]
# 오름차순으로 정렬된 새로운 리스트 생성
sorted_numbers = sorted(numbers)
print(sorted_numbers) # 출력: [1, 2, 5, 6, 8]
# 내림차순으로 정렬된 새로운 리스트 생성
reverse_sorted_numbers = sorted(numbers, reverse=True)
print(reverse_sorted_numbers) # 출력: [8, 6, 5, 2, 1]
# 절댓값을 기준으로 정렬된 새로운 리스트 생성
abs_sorted_numbers = sorted(numbers, key=abs)
print(abs_sorted_numbers) # 출력: [1, 2, 5, 6, 8]
sorted() 함수는 원본 리스트를 변경하지 않고 새로운 정렬된 리스트를 반환하기 때문에
기존의 데이터를 유지하면서 정렬된 데이터를 얻고 싶을 때 유용
특정 인덱스부터 시작하는 문자열을 모두 저장하고, 정렬한 리스트를 출력하는 문제이다.
def solution(my_string):
answer = []
for i in range(len(my_string)):
answer.append("".join(c for c in my_string[i:]))
return sorted(answer)
위 문제를 간결하게 작성하면 아래와 같다.
def solution(my_string):
answer = sorted(["".join(c for c in my_string[i:]) for i in range(len(my_string))])
return answer
③ reverse 메서드
list.reverse()
reverse 메서드는 sort 메서드처럼 원본 리스트 자체를 정렬(변경)시킨다.
my_list = [1, 2, 3, 4, 5]
# 리스트를 역순으로 뒤집기
my_list.reverse()
print(my_list) # 출력: [5, 4, 3, 2, 1]
reverse 메서드랑 sort(reverse=True / False) 둘 다 똑같아 보이지만 리스트 내용이 무엇이냐에 따라 달라진다.
list.reverse() 는 리스트에 들어있는게, 숫자든 문자열이든 뭐든 리스트를 뒤집는거에 중점을 두기때문에 정렬은 되지 않는다.
list.sort(reverse=True)는 리스트의 숫자를 내림차순 정렬하는 것이다.
④ 리스트 슬라이싱
변수 = list[ : : -1 ]
슬라이싱은 [ start : stop : step ]으로 마지막 step이 -1이면, 뒤에서 앞으로 출력을 하는 것
my_string = "Hello, World!"
reversed_string = my_string[::-1]
print(reversed_string) # 출력: "!dlroW ,olleH"
reverse() 메서드는 원본 리스트 자체를 뒤집는거지만,
list[ : : -1 ]는 원본 리스트는 그대로 두고, 뒤집은 리스트를 다른 곳에 저장하는 차이가 있음
전체 리스트를 뒤집어서 출력할려는게 아닌, 일부 인덱스에 해당하는 부분만 뒤집기를 원한다.
list.reverse(), list.sort(reverse=True), sorted(list, reverse=True) 이 세가지는 모두 전체 리스트를 뒤집는거라서 활용할 수 없다.
인덱스 슬라이싱을 활용해야하는데, 주의할 점이 있어서 추가한다.
list[ s : e+1 ] 만큼만 뒤집고 싶은 경우에 list[ s : e+1 : -1 ] 이렇게 쓰면 안된다.
왜냐하면, step -1이 되면서 s
에서 e+1
까지의 범위에 대해 역순으로 슬라이싱하려고 하기 때문에, s
가 e+1
보다 더 뒤에 위치한 것으로 간주된다. 하지만, 이 문제에서 s는 e 보다 앞에 있기때문에 원하는 결과값이랑 다르게 출력이된다.
def solution(my_string, queries):
l = list(my_string)
for s, e in queries :
l = l[:s] + l[s:e+1][::-1] + l[e+1:] #l[e:s-1:-1] or l[s:e+1][::-1]
return ''.join(l)
list 메서드
① count
list.count(value)
리스트에 해당 value값의 요소가 몇개인지 갯수 조사
>>> a = [1, 2, 3, 1]
>>> a.count(1)
2
② extend
list.extend(iterable)append(value)는 요소 하나의 값을 추가하는 것이지만,
extend(iterable)은 리스트를 넣을 수 있음
>>> a = [1, 2, 3]
>>> a.extend([4, 5])
>>> a
[1, 2, 3, 4, 5]
>>> b = [6, 7]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6, 7]
a += [4, 5]
리스트에 + 연산해서 다른 리스트 합친거랑 같은 역할을 한다.
리스트 컴프리헨션을 활용해도 같은 기능
③ index
list.index(x[, start[, end]])
① x: 찾을 값.
② start (선택): 검색을 시작할 인덱스. 기본값은 0
③ end (선택): 검색을 종료할 인덱스. 기본값은 리스트의 마지막 인덱스
fruits = ["apple", "banana", "orange", "apple", "grape"]
# "apple"의 첫 번째 등장하는 인덱스를 찾기
index1 = fruits.index("apple")
print(index1) # 출력: 0
# 두 번째 "apple"의 인덱스를 찾기 (시작 인덱스를 지정)
index2 = fruits.index("apple", 1)
print(index2) # 출력: 3
# "orange"의 인덱스를 찾기 (시작과 종료 인덱스를 지정)
index3 = fruits.index("orange", 1, 3)
# ValueError: 'orange' is not in list within the specified indices
④ join
seperator.join(iterable)
① seperator : 각 요소 사이에 삽입될 문자열
my_list = ["apple", "banana", "orange"]
result = " ".join(my_list)
print(result) # 출력: "apple, banana, orange"
list 함수
① len
② max / min
③ sum
numbers = [1, 2, 3, 4, 5]
total = sum(numbers)
print(total) # 출력: 15
total_with_start = sum(numbers, start=10)
print(total_with_start) # 출력: 25
댓글
댓글 쓰기