PLOD

[python] 리스트(List) 본문

개발 공부/Python

[python] 리스트(List)

훌룽이 2023. 1. 31. 00:01

1. 배열 (Array) : 선형으로 자료를 관리, 정해진 크기의 메모리를 먼저 할당 박아 사용하고, 자료의 물리적 위치와 논리적 위치가 같음

 

 

2차원 배열에서 2행의 배열을 입력받고 싶을 때는 다음과 같이 입력 받는다. 

# 여기서 range 안의 2는 행의 갯수를 나타낸다
arr_2d = [list(map(int,input().split())) for _ in range(2)]


list comprehension을 이용하면 처음에 n * n 크기의, 전부 0으로 채워져 있는 2차원 배열을 다음과 같이 선언할 수 있다.

n, m = 4, 5
arr_2d = [
    [0 for _ in range(m)]
    for _ in range(n)
]
print(arr_2d)

>> 출력 결과
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

* python 리스트의 함수

 

1. pop()

pop 함수는 리스트의 특정 인덱스 값을 삭제 및 반환하는 기능을 가지고 있다. 

s = 'baknana'
arr = list(s)
arr.pop(2)
s = ''.join(arr)
print(s)

>> banana

 

- arr.pop(삭제 할 인덱스)

 

2. remove()

remove 함수는 pop 함수와는 다르게 인덱스 값을 지정하여 해당 위치에 있는 값을 삭제하는 것이

아니고 삭제할 값을 명시한다는 점이 다르다.

 

- arr.remove(삭제할 값)

 

3. append()

append 함수는 새로운 값을 기존 리스트의 끝에 추가할 때 사용한다. 

 

-arr.append(추가할 값)

 

4. extend()

extend 함수는 기존 리스트에 새로운 리스트이 내용 전부를 추가할 때 사용한다..

 

-arr.extend(추가할 배열)

 

5. insert()

insert 함수는 리스트의 특정 인덱스 값에 원하는 자료형에 데이터를 입력하는 기능을

가진다. 

 

-arr.insert(삽입할 인덱스, 삽입할 값)

 

6. count()

count 함수는 리스트에 저장된 값들 중 특정 데이터의 개수를 반환하는 함수이다.

 

-arr.count(셀 값)

 

7. clear()

clear 함수는 리스트에 저장된 값들을 전부 삭제하는 기능을 가지고 있다.

 

-arr.clear()

 

8.reverse()

reverse 함수는 리스트에 할당 된 값들의 순서를 거꾸로 뒤집는 함수이다.

 

-arr.reverse()

 

9.sort()

sort 함수는 리스트에 할당된 값들의 순서를 오름차순으로 정렬하는 함수이다.

 

-arr.sort()

 

10.enumerate()

enumerate 함수는 리스트에서 탐색을 할 때 특정 원소의 인덱스를 찾아야 할때 사용한다.enumerate로 list를 감싸면, 원소로 (index, 원소)를 동시에 받으며 진행할 수 있다.

word = ['A', 'P', 'P', 'L', 'E']

# 해당 문자를 찾지 못했다면 -1
idx = -1

# 문자 탐색
for i, char in enumerate(word):
    if char == 'L':
        idx = i

# 문자가 존재하지 않는 경우
if idx == -1:
    print("not exist")
else:
    print(idx)
=============================================
>> 3

11. max()

python의 경우 max() 함수를 사용하여 바로 리스트의 최대값을 구할 수 있다.

arr = [-1, -5, -2, -5, -3, -9]

print(max(arr))
>> -1

 

12.min()

python의 경우 min() 함수를 사용하여 바로 리스트의 최솟값을 구할 수 있다.

arr = [11, 15, 12, 15, 13, 19]

print(min(arr))
>> 11

 

2차원 배열 만들기 

2차원 배열은 DP, DFS,BFS 문제에서 꼭 나오는 구현이기 때문에 만드는 방법을 숙지 해야 한다.

n,m = map(int,input().split())

arr = [[0 for _ in range(m)] for _ in range(n)]
num = 1

for i in range(n) :
    for j in range(m) :
        arr[i][j] = num 
        num +=1


for i in range(n) :
    for j in range(m) :
        print(arr[i][j], end=" ")
    print()
    
===================================================

>>
1 2 3 
4 5 6 
7 8 9

 

특정 문자열 확인

문자열 s 에 특정 문자열 'ab' 가 포함되어 있는 지 여부를 확인하는 방법은, 논리적으로 접근한다면

각각의 위치에 대해 조사하며 그 중 정확히 'ab'와 일치하는 위치가 있었는지 확인.

이때 for loop를 [0:length-2] 에서만 돌아야 한다.

s = 'appleabanana'
length = len(s)
exists = False

for i in range(length - 1):
    if s[i] == 'a' and s[i + 1] == 'b':
        exists = True

print(exists)

===================================================================

s = 'appleabanana'
length = len(s)
exists = False

for i in range(length - 1):
    if s[i:i + 2] == 'ab':
        exists = True

print(exists)

만약 판단하고자 하는 부분문자열이 'ab'와 같이 2자리가 아닌 input으로 주어진다 했을 때는

in 키워드를 사용하지 않고도 구현이 가능하다. 문자열 t의 길이를 len_t라 했을 때,

결국 s[i]와 t[0], s[i + 1]과 t[1] ...그리고 s[i + len_t - 1]과 t[len_t - 1]이 전부 일치하기를 바라는 것이기

때문에 이 역시도 boolean 값을 만들어 전부 일치하는지에 대한 여부를 판단하면 된다.

#  i 01234567891011
s = 'appleabanana'
t = 'abbaba'

n = len(s)
exists = False

len_t = len(t)

for i in range(n - len_t + 1):
    all_same = True
    for j in range(len_t):
        if s[i + j] != t[j]:
            all_same = False
    
    #if s[i] == t[0] and s[i + 1] == t[1] and ....
    #    s[i + len_t - 1] == t[len_t - 1]:
    if all_same == True:
        exists = True

print(exists)

python 리스트 함수

join()

리스트의 원소들을 concat하여 문자열로 합쳐 출력할 때 사용한다.

arr = ["apple","banana","candy"]

total_str = "".join(arr)

print(total_str)
======================================

>> applebananacandy

다음은 문자열을 알파벳 순서로 정렬하여 출력하는 코드이다.

string = "banana"
arr = list(string)
arr.sort()
print(arr) # ['a', 'a', 'a', 'b', 'n', 'n']
sorted_str = ''.join(arr)
print(sorted_str) # aaabnn

 

 

in ,not in

전체 리스트에서 특정 원소를 찾고 싶을 때 사용한다. 특정 원소가 존재한다 True를 반환한다.  not in은 반대로 존재하지 않는다면 True를 반환한다.

word_find,n = input().split()

if n in word_find :
    print(word_find.index(n))
else :
    print("No")
    
=======================================

테스트 케이스 : LeeBrosCode o

>> 5

ex) 백준 1436번 . 영화 감독 숌

n = int(input())
charactor = 666
cnt = 0
while True :
  if '666' in str(charactor) :
    cnt += 1
  if cnt == n :
    print(charactor)
    break
  charactor += 1

index()

전체 리스트에서 특정 원소값의 위치(인덱스)를 찾고자 할 때 사용한다.  리스트.index(찾을값)

다음의 코드는 백준 2562문제로 최대값과 순서를 찾는 문제이다. 만약 리스트에 값이 없다면 -1을 출력한다.

arr = []
for i in range(9) :
  n = int(input())
  arr.append(n)

max = arr[0]
for i in arr :
  if i > max :
    max = i


print(max)
print(arr.index(max)+1)

 

set()

전체 리스트에서 중복된 데이터를 제거해준다. set(리스트) 방식으로 사용된다. 

arr = []
for i in range(10):
    n = int(input())
    arr.append(n % 42)
arr = set(arr)
print(len(arr))

 

sorted()

리스트 뿐만 아니라 문자열을 정렬할 때 사용하는 함수이다. 

string = "banana"
sorted_arr = sorted(string)
print(sorted_arr) # ['a', 'a', 'a', 'b', 'n', 'n']
sorted_str = ''.join(sorted_arr)
print(sorted_str) # aaabnn

 

find()

리스트나 문자열에서 특정 원소의 인덱스를 찾을 때 사용한다. 특정 원소를 찾으면 시작하는 문자열 인덱스를 반환하고, 없다면 -1을 반환한다. 예시로 단어가 n개 주어졌을 때, 문자열 T로 시작하는 단어들 중 사전순으로 정렬했을 때의 k번째 문자열을 출력하는 프로그램을 작성해보았다.

n,k,T = input().split()
arr = []

for _ in range(int(n)) :
    word = input()
    if word.find(T) == 0 :
        arr.append(word)

arr.sort()

print(arr[int(k)-1])

※ 2차원 배열 생성시 유의 팁

arr = [[0] * (n+1)]
print(arr)

arr = [[0] for i in range(n+1)]
print(arr)

다음은 같을까? 정답은 틀리다 다음의; 출력결과를 보면 다음과 같이 출력 되는 것을 볼 수 있다. 

[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
Comments