[파이썬 알고리즘] 문자열 함수 & 리스트 & 딕셔너리

신현식·2023년 4월 30일
0

파이썬알고리즘

목록 보기
1/4
post-thumbnail
post-custom-banner

print

  • 파이썬에서 나눗셈을 실시
    • / : 소수점까지 모두 표현
    • //: 정수 부분만 표현, [int(a/b)]와 같음
    • divmod(5,3) : 몫과 나머지를 동시에 구해줌 ->(1, 2)

print문을 이용해 가장 쉽게 값을 출력하는 방법은 콤마로 구분하는 것이다. 이 경우 한칸 공백이 디폴트로 설정되어 있으며, 그대로 출력하면 띄어쓰기로 값을 구분해준다.

 print('A1', 'B1')
 -> A1 B1

# sep 파라미터로 구분자를 콤마로 지정, 이 경우 공백을 따로 설정하지 않으면 공백은 없다.
print('A1', 'B1', sep=',')
-> A1,B1

# 줄바꿈 없애기
print('aa', end = ' ')
print('bb')
-> aa bb

# 리스트 출력
a=['A', 'B']
print(' '.join(a))
-> A B
  • f-string: 변수를 뒤에 별도로 부여할 필요없이 인라인으로 삽입가능
idx=1
fruit 'Apple'

print(f'{idx+1}: {fruit}')
 -> 2: Apple
 
 # format 사용
 print('{}: {}'.format(idx+1. fruit))
 > 2: Apple

문자열 관련 함수

문자열 자료형은 자체적으로 함수를 가지고 있다. 이들 함수를 다른 말로 문자열 내장 함수라 한다. 이 내장 함수를 사용하려면 문자열 변수 이름 뒤에 ‘.’를 붙인 다음에 함수 이름을 써주면 된다.

문자 개수 세기(count)

>>> a = "hobby"
>>> a.count('b')
2
  • 문자열 중 문자 b의 개수를 리턴한다.

위치 알려주기(find)

>>> a = "Python is the best choice"
>>> a.find('b')
14
>>> a.find('k')
-1
  • 문자열 중 문자 b가 처음으로 나온 위치를 반환한다. 만약 찾는 문자나 문자열이 존재하지 않는다면 -1을 반환한다.
    파이썬은 숫자를 0부터 세기 때문에 b의 위치는 15가 아닌 14가 된다.

위치 알려주기(index)

>>> a = "Life is too short"
>>> a.index('t')
8
>>> a.index('k')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
  • 문자열 중 문자 t가 맨 처음으로 나온 위치를 반환한다. 만약 찾는 문자나 문자열이 존재하지 않는다면 오류를 발생시킨다. 앞의 find 함수와 다른 점은 문자열 안에 존재하지 않는 문자를 찾으면 오류가 발생한다는 점이다.

문자열 삽입(join)

>>> ",".join('abcd')
'a,b,c,d'

>>> ",".join(['a', 'b', 'c', 'd'])
'a,b,c,d'
  • abcd 문자열의 각각의 문자 사이에 ','를 삽입한다.
  • join 함수는 문자열뿐만 아니라 리스트나 튜플도 입력으로 사용할 수 있다.

소문자를 대문자로 바꾸기(upper) / 대문자를 소문자로 바꾸기(lower)

>>> a = "hi"
>>> a.upper()
'HI'
  • upper 함수는 소문자를 대문자로 바꾸어 준다. 만약 문자열이 이미 대문자라면 아무 변화도 일어나지 않을 것이다.
>>> a = "HI"
>>> a.lower()
'hi'
  • lower 함수는 대문자를 소문자로 바꾸어 준다.

특정 문자열 지우기

# 왼쪽 공백 지우기(lstrip)
>>> a = " hi "
>>> a.lstrip()
'hi '
- 문자열 중 가장 왼쪽에 있는 한 칸 이상의 연속된 공백들을 모두 지운다. lstrip에서 l은 left를 의미한다.

# 오른쪽 공백 지우기(rstrip)
>>> a= " hi "
>>> a.rstrip()
' hi'
- 문자열 중 가장 오른쪽에 있는 한 칸 이상의 연속된 공백을 모두 지운다. rstrip에서 r는 right를 의미한다.

# 양쪽 공백 지우기(strip)
>>> a = " hi "
>>> a.strip()
'hi'
- 문자열 양쪽에 있는 한 칸 이상의 연속된 공백을 모두 지운다.

>>> a = " aaaaaaaaaahioaaa"
>>> a.strip('a')
'hio'

💡 문자열 바꾸기(replace)

>>> a = "Life is too short"
>>> a.replace("Life", "Your leg")
'Your leg is too short'

replace(바뀌게 될 문자열, 바꿀 문자열)처럼 사용해서 문자열 안의 특정한 값을 다른 값으로 치환해 준다.

문자열 나누기(split)

>>> a = "Life is too short"
>>> a.split()
['Life', 'is', 'too', 'short']
>>> b = "a:b:c:d"
>>> b.split(':')
['a', 'b', 'c', 'd']
  • split 함수는 a.split()처럼 괄호 안에 아무 값도 넣어 주지 않으면 공백(스페이스, 탭, 엔터 등)을 기준으로 문자열을 나누어 준다.
  • 만약 b.split(':')처럼 괄호 안에 특정 값이 있을 경우에는 괄호 안의 값을 구분자로 해서 문자열을 나누어 준다. 이렇게 나눈 값은 리스트에 하나씩 들어가게 된다.

리스트

파이썬의 리스트는 입력 순서가 유지되며, 내부적으로 동적 배열로 구현되어 있어 삽입/삭제가 가능한 자료구조이다.

리스트 요소 삭제하기: del()

>>> a = [1, 2, 3]
>>> del a[1]
>>> a
[1, 3]
  • del a[x]는 x번째 요솟값을 삭제한다. 여기에서는 a 리스트에서 a[1]을 삭제하는 방법을 보여준다. del 함수는 파이썬이 자체적으로 가지고 있는 삭제 함수이며 다음과 같이 사용한다.

인덱스 반환(index)

index(x) 함수는 리스트에 x 값이 있으면 x의 인덱스 값을 리턴한다.

>>> a = [1,2,3]
>>> a.index(3)
2
>>> a.index(1)
0
  • 리스트 a에 있는 숫자 3의 위치는 a[2]이므로 2를 리턴하고, 숫자 1의 위치는 a[0]이므로 0을 리턴한다.

리스트에 요소 삽입(insert)

insert(a, b)는 리스트의 a번째 위치에 b를 삽입하는 함수이다. 파이썬은 숫자를 0부터 센다.

>>> a = [1, 2, 3]
>>> a.insert(0, 4)
>>> a
[4, 1, 2, 3]

리스트 요소 제거(remove)

remove(x)는 리스트에서 첫 번째로 나오는 x를 삭제하는 함수이다.

>>> a = [1, 2, 3, 1, 2, 3]
>>> a.remove(3)
>>> a
[1, 2, 1, 2, 3]
  • a가 3이라는 값을 2개 가지고 있을 경우 첫 번째 3만 제거되는 것을 알 수 있다.

리스트에 포함된 요소 x의 개수 세기(count)

count(x)는 리스트 안에 x가 몇 개 있는지 조사하여 그 개수를 리턴하는 함수이다.

>>> a = [1,2,3,1]
>>> a.count(1)
2
  • 1이라는 값이 리스트 a에 2개 들어 있으므로 2를 리턴한다.

리스트 컴프리헨션

파이썬은 map, filter와 같은 함수형 기능을 지우너하며 람다 표현식도 지원한다.


list(map(lambda x:x+10, [1,2,3]))
-> [11,12,13]

# 홀수인 경우 2를 곱해서 출력하라
# 리스트 컴프리헨션
[n*2 for n in range(1,10+1) if n%2 ==1]
-> [2,6,10,14,18]

# 일반 식
a=[]
for n in range(1,10+1):
    if n%2 ==1:
        a.append(n*2)

# 딕션너리도 가능
a={}
for key, value in original.items():
    a[key]=value

# 같은 식 다른표현
a = {key: value for key, value in original.items()}

enumerate()

enumerate()는 열거하다는 뜻의 함수로 여러가지 자료형(list, set, tuple)을 인덱스를 포함한 enumerate 객체로 리턴한다.

a=[1,2,3,43,10]
list(enumerate(a))
-> [(0,1), (1,2), (2,3), (3, 43), (4, 10)]


# 리스트 값과 인덱스와 모두 출력 
i=0 
for v in a:
  print(i, v)
  i+=1
 
------------------------------

for i, n in enumerate(a)
  print(i, v)
  • list()로 결과를 추출할 수 있는ㄷ 인덱스를 자동으로 부여해주기 떄문에 매우 편리하게 사용가능하다.

딕셔너리

딕셔너리는 중괄호 { }로 선언하며 '키:값'의 형태를 쉼표(,)로 연결해서 만듭니다. 키는 문자열, 숫자, 불 등으로 선언할 수 있습니다. 딕셔너리는 리스트나 튜플처럼 순차적으로(sequential) 해당 요솟값을 구하지 않고 Key를 통해 Value를 얻는다.

  • 딕셔너리 요소에 접근
    딕셔너리 요소에 접근할 때에는 리스트처럼 딕셔너리 뒤에 대괄호 []를 사용하고 대괄호 안에는 내부 인덱스를 넣듯이 '키'를 입력하면 된다. 딕셔너리는 선언할 때에는 중괄호{}로 선언하지만 요소에 접근할 때에는 대괄호[]를 사용한다.
# print(dictionary_a["name"])
# print(dictionary_a["gender"])

# 딕셔너리를 선언합니다.
dictionary = {
    "name" : "홍길동",
    "gender" : "",
    "ability" : ["축구", "공부", "연설", "원활한인간관계"],
    "nation" : "한국",
}

print("name : {}".format(dictionary["name"]))
print("gender : {}".format(dictionary["gender"]))
print("ability : {}".format(dictionary["ability"]))
print("nation : {}".format(dictionary["nation"]))
print()

# 값 변경
dictionary["name"] = "각시탈"
print("name : {}".format(dictionary["name"]))

# 값이 리스트일 때는 리스트 안의 특정값을 접근해서 출력할 수도 있습니다.
print("ability {} : {}".format(0, dictionary["ability"][0]))
print("ability {} : {}".format(1, dictionary["ability"][1]))
print("ability {} : {}".format(2, dictionary["ability"][2]))
print("ability {} : {}".format(3, dictionary["ability"][3]))

딕셔너리 내장 함수 : items, keys, values

  • 딕셔너리.items() : 딕셔너리의 (key, value)를 반환함
  • 딕셔너리.keys() : 딕셔너리의 key를 반환함
  • 딕셔너리.values() : 딕셔너리의 value를 반환함

사전의 기본값 처리 (dict.setdefault / collections.defaultdict)

파이썬의 내장 자료구조인 사전(dictionary)를 사용하다 보면 어떤 키(key)에 대한 값(value)이 없는 경우에 대한 처리를 해야하는 경우가 자주 발생한다. 이러한 경우 일반적으로 어떻게 처리를 하는지 살펴볼 것이다.

아래 코드는 주어진 단어에 들어있는 각 알파벳 글자의 수를 세어서 사전에 저장해주는 함수이다. 여러 방식으로 문제를 해결해볼 것이다.

일반적인 사전 기본값 처리

def countLetters(word):
    counter = {}
    for letter in word:
        if letter not in counter:
            counter[letter] = 0
        counter[letter] += 1
    return counter
  • for 루프 안에 if 조건절을 통해서 counter 사전에 어떤 글자가 키(key)로 존재하지 않는 경우, 해당 키에 대한 기본값을 0으로 세팅해주고 있다.

나은 방법: dict.setdefault

위와 같은 if 조건절을 피할 수 있도록 파이썬의 사전(dictionary) 자료구조는 setdefault 함수를 제공한다. 첫번째 인자로 키(key)값, 두번째 인자로 기본값(default value)를 넘긴다.

def countLetters(word):
    counter = {}
    for letter in word:
        counter.setdefault(letter, 0)
        counter[letter] += 1
    return counter
  • for 루프 내에서 setdefault 함수가 무조건적으로 항상 호출된다.

더 나은 방법: collections.defaultdict

파이썬의 내장 모듈인 collections의 defaultdict 클래스의 생성자로 기본값을 생성해주는 함수를 넘기면, 모든 키에 대해서 값이 없는 경우 자동으로 생성자의 인자로 넘어온 함수를 호출하여 그 결과값으로 설정해준다.

먼저, collections 모듈의 defaultdict 클래스는 다음과 같이 임포트해야 합니다.

  • import 한 defaultdict를 이용해서 개선하면, for 루프로 부터 사전의 기본값 처리 코드를 완전히 제거할 수가 있다.
from collections import defaultdict

def countLetters(word):
    counter = defaultdict(int)
    for letter in word:
        counter[letter] += 1
    return counter
  • 여기서 defaultdict 클래스의 생성자로 int 함수를 넘긴 이유는 int()는 0을 리턴하기 때문입니다. 람다 함수를 활용해서 다음과 같이 int 함수 대신에 lambda: 0를 넘겨도 동일하게 작동한다.
from collections import defaultdict

def countLetters(word):
    counter = defaultdict(lambda: 0)
    for letter in word:
        counter[letter] += 1
    return counter

set

집합에 관련된 것을 처리 하기 위해 만들어진 자료형이다. set 키워드를 사용하거나 중괄호를 이용해서 표현할 수 있다.

# 세개 다 같은 집합을 만듭니다.
s1 = set({1, 2, 3})
s2 = set([1, 2, 3])
s3 = {1, 2, 3}

->print(s) 
{1, 2, 3}
  • 비어있는 집합을 만들기 위해서는 아래와 같이 사용한다.
    s4 = set()

  • 리스트나 튜플은 순서가 있기(ordered) 때문에 인덱싱을 통해 자료형의 값을 얻을 수 있지만 set 자료형은 순서가 없기(unordered) 때문에 인덱싱으로 값을 얻을 수 없다.

    • 중복을 허용하지 않는다.
    • 순서가 없다.(Unordered)

값 여러개 추가하기: update()

  • set.update() 메서드를 이용하면 집합의 값을 한번에 여러개 추가 할 수 있다. 자세히 보면 요소를 추가할때 리스트를 뜻하는 대괄호[] 혹은 집합 자료형을 뜻하는 중괄호{}를 이용해서 추가하는 것을 볼 수 있다.
# 값 1개 추가하기(add)
이미 만들어진 set 자료형에 값을 추가할 수 있다. 1개의 값만 추가(add)할 경우에는 다음과 같이 한다.
s1 = set([1, 2, 3])
s1.add(4)
-> s1
{1, 2, 3, 4}

------------------------------------------

# 값 여러 개 추가하기(update)
여러 개의 값을 한꺼번에 추가(update)할 때는 다음과 같이 하면 된다.
s1 = set([1, 2, 3])
s1.update([4, 5, 6])
-> s1
{1, 2, 3, 4, 5, 6}

s = {1, 2, 3}
print(f'set : {s}')
 
s.update({'a', 'b', 'c'})
print(f'set : {s}')
 
s.update([1, 12, 13])
print(f'set : {s}')
->
set : {1, 2, 3}
set : {1, 2, 3, 'b', 'a', 'c'}  순서의미가 없음
set : {1, 2, 13, 3, 'b', 12, 'a', 'c'}

교집합/합집합/차집합

>>> s1 = set([1, 2, 3, 4, 5, 6])
>>> s2 = set([4, 5, 6, 7, 8, 9])

- 교집합
>>> s1 & s2
{4, 5, 6}
"&" 기호를 이용하면 교집합을 간단히 구할 수 있다.

>>> s1.intersection(s2)
{4, 5, 6}
s2.intersection(s1)을 사용해도 결과는 같다.


- 합집합
# 중복해서 포함된 값은 한 개씩만 표현
>>> s1 | s2
{1, 2, 3, 4, 5, 6, 7, 8, 9}

>>> s1.union(s2)
{1, 2, 3, 4, 5, 6, 7, 8, 9}
# s2.union(s1)을 사용해도 동일

- 차집합
>>> s1 - s2
{1, 2, 3}
>>> s2 - s1
{8, 9, 7}

>>> s1.difference(s2)
{1, 2, 3}
>>> s2.difference(s1)
{8, 9, 7}

특정값 제거하기: remove()


# 특정 값 제거하기(remove)
- set 내부에 값이 있으면 삭제
- set 내부에 값이 없으면 오류

s = {'kim', 'lee', 'park', 2, 3, 4}
print(f'집합 : {s}')
 
s.remove("kim")
print(f'집합 : {s}')
 
# 에러 발생
# s.remove("kim")
# print(f'집합 : {s}')

-------------------------------------

# set discard - 특정 요소 안전하게 제거
- 집합 내부에 값이 있으면 삭제.
- 집합 내주에 값이 없으면 아무일도 일어나지 않음.
s = {'kim', 'lee', 'park', 2, 3, 4}
print(f'집합 : {s}')
 
s.discard("lee")
print(f'집합 : {s}')
 
s.discard("lee")
print(f'집합 : {s}')

-> 
{'kim', 'lee', 'park', 2, 3, 4}
{'kim', 'park', 2, 3, 4}
{'kim', 'park', 2, 3, 4}
profile
전공 소개
post-custom-banner

0개의 댓글