STUDY/Python

코딩테스트 대비 Python 기초 공부

둥둥런 2022. 12. 9. 10:14

멋쟁이사자처럼 ai school 7기 이호준 강사님(제주코딩베이스캠프) 강의를 바탕으로 작성하였습니다.

 

리스트

리스트 컴프리헨션

출처_코딩도장 https://wikidocs.net/22805

# 2의 배수 출력
[ 2*x for x in range(1, 10+1) ]
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
# if 문 함께 사용
[x for x in range(1, 10+1) if x % 2 == 0]
[2, 4, 6, 8, 10]

메서드 (리스트)

#리스트 메서드 확인
# dir([1,2,3])
"""
'append',
 'clear',
 'copy',
 'count',
 'extend',
 'index',
 'insert',
 'pop',
 'remove',
 'reverse',
 'sort'
"""
"\n'append',\n 'clear',\n 'copy',\n 'count',\n 'extend',\n 'index',\n 'insert',\n 'pop',\n 'remove',\n 'reverse',\n 'sort'\n"
# count
# 숫자 카운팅
[1,2,1,1,1,4,43,3,5,11,111,11].count(1)
4
 # 문자 카운팅 - 문자열 변환
str([1,2,1,1,1,4,43,3,5,11,111,11]).count("1")
11
# 1부터 10,000까지 8이라는 숫자가 총 몇번 나오는가? 
str(list(range(10000))).count("8")
4000

map

문자 배열을 정수로 변환하는

  • map(int, L)
  • 리스트컴프리헨션과 비교

함수를 재활용 할거라면 def 형태로 선언, 아니라면 lambda함수를 Map과 많이 활용

L =  ['1','11','125']
[int(i) for i in L]
[1, 11, 125]
list(map(int, L))
[1, 11, 125]
sum([int(i) for i in L])
137
sum(map(int, L))
137
numbers = [1, 2, 3, 4, 5]
list(map(lambda x: 2*x, numbers)) #map만 출력하면 주소만 반환
[2, 4, 6, 8, 10]
# 리스트 안의 차이로 새로운 리스트 만들기
def 함수(x):
    return x[1] - x[0]

ㅣ = [[1,3],[2,5],[3,10],[1,5],[6,7]]

list(map(함수, ㅣ))
[2, 3, 7, 4, 1]
list(map(lambda x:x[1]-x[0], ㅣ))
[2, 3, 7, 4, 1]

zip 활용

#zip 보통 2개씩 묶을때 사용, 개수는 그 이상도 가능
list(zip('abcde','12345'))
[('a', '1'), ('b', '2'), ('c', '3'), ('d', '4'), ('e', '5')]
# 문제: 차를 구하고 문자는 보존하기 
# 원소간 개수가 맞지 않으면 끝까지 나오지 않는다.
list(zip(range(10), 'hello world', [30,50,60,100,30,4,10]))
[(0, 'h', 30),
 (1, 'e', 50),
 (2, 'l', 60),
 (3, 'l', 100),
 (4, 'o', 30),
 (5, ' ', 4),
 (6, 'w', 10)]

1차원의 점들이 주어졌을 때, 그 중 가장 거리가 짧은 것의 쌍을 출력하는 함수를 작성하시오. (단 점들의 배열은 모두 정렬되어있다고 가정한다.)
예를들어 S = [1, 3, 4, 8, 13, 17, 20] 이 주어졌다면, 결과값은 (3, 4)가 될 것이다.
문제링크 : https://codingdojang.com/scode/408

s = [1, 3, 4, 8, 13, 17, 20]
list(zip(s,s[1:]))
[(1, 3), (3, 4), (4, 8), (8, 13), (13, 17), (17, 20)]

정렬

배열 문제 풀기

# sorted(list(), key=?, reverse=True)
# list.sort(reverse=True)
# key에 함수활용 return값은 정렬하고자 하는 기준

.sort()와 sorted의 차이

  • .sort(): "리스트형의 메소드"이며, 리스트 원본 값 자체를 변경, 값을 반환하지 않고 정렬만 변경해주는 것
  • sorted(리스트): "내장 함수"이며, 리스트 원본 값을 유지한 채 정렬 값을 반환한다.
# .sort는 원본이 바뀌고, 출력을 해줘야 바뀐 정렬을 보여준다.
a = [115,37,26,72,15,74]
a.sort(reverse=True)
a
[15, 26, 37, 72, 74, 115]
def 함수(value):
    return [value[1] -value[0], (value[0], value[1])]

s = [1,3,4,8,13,17,20]
list(map(함수, zip(s,s[1:])))

sorted(list(map(함수, zip(s,s[1:]))), key=lambda x:x[0], reverse=False)
# key는 기준, reverse는 오름차, 내림차 전환
# 가장 적은 차이는 정렬의 첫번째 값 x[0] 또는 min
[[1, (3, 4)],
 [2, (1, 3)],
 [3, (17, 20)],
 [4, (4, 8)],
 [4, (13, 17)],
 [5, (8, 13)]]

배열의 정렬 순서 반환 (index)

# .index 활용하기
# 정렬 시의 순서 반환
a = [1,2,6,3,7]
s = sorted(a, reverse = True)
[s.index(i) + 1 for i in a]
[5, 4, 2, 3, 1]
  • id() 객체의 고유 주소값
  • type() 타입을 반환
x = 1000
y = x
z = y
print(id(x),id(y),id(z))
140186132010448 140186132010448 140186132010448

for문으로 최소값 구하기 (크기 비교하기)

# for문으로 최소값 구하기 100-> 1 ->1 
s = [100, 1,3,4,8,13,17,20]
m = float('inf') #양의 무한대
for i in s:
    if i < m:
        m=i
print(m)
array = [149, 180, 192, 170]
height = 167
sorted(array)
a=0
for i in array:
    if i > height:
        print(i)
        a+=1
        print(a)
180
1
192
2
170
3
# 두 수의 차이의 최솟값 구하기
s  = [1, 3, 4, 8, 13, 17, 20]
최솟값 = float('inf')
인덱스 = 0

for i in range(len(s)-1):
    if (s[i+1] - s[i]) < 최솟값:
        최솟값 = s[i+1] - s[i]
        인덱스 = i

print(s[인덱스], s[인덱스+1], 최솟값)
3 4 1

정규 표현식 연습

import re
re.sub('A','','abcde12345ABCDEabcde12345ABCDE')
'abcde12345BCDEabcde12345BCDE'
re.sub('[a-z]','','abcde12345ABCDEabcde12345ABCDE')
'12345ABCDE12345ABCDE'
re.sub('[123]','','abcde12345ABCDEabcde12345ABCDE')
'abcde45ABCDEabcde45ABCDE'
re.sub('[a-zA-Z]','','abcde12345ABCDEabcde12345ABCDE')
'1234512345'
re.sub('[0-9]','','abcde12345ABCDEabcde12345ABCDE')
'abcdeABCDEabcdeABCDE'

특정 문자열 대체하기 문제

import re

def solution(my_string, letter):
    return re.sub(letter, '', my_string)
def solution(my_string, letter):
    return my_string.replace(letter, '')

지정한 형식 문자만 가져오기: re.findall

re.findall('[0-9]', 'aAb1B2cC34oOp')
['1', '2', '3', '4']

숨어있는 숫자의 덧셈(1) https://school.programmers.co.kr/learn/courses/30/lessons/120851

import re

def solution(my_string):
    return sum(map(int,re.findall('[0-9]', my_string)))

삼항연산자

print('hi') if True else print('bye')
1 if True else 2
# 1 if False else 2
1
# 문자열 안에 문자열 in 활용
def solution(str1, str2):
    return 1 if str2 in str1 else 2

자료형 판별

# 숫자형
'1'.isnumeric()
'1'.isdigit()
True
'T'.isdigit()
False
1.isdigit #오류
  Input In [66]
    1.isdigit
      ^
SyntaxError: invalid syntax
#소문자 대문자
'abc'.islower()
'abc'.isupper()
# 영문자
# 'abd'.isalpha()
False
# 대문자, 소문자 변경
'abc'.upper()
# 'abc'.lower()
'ABC'
# 사용 가능한 리스트
dir('hello')
"""
'isalnum',
 'isalpha',
 'isascii',
 'isdecimal',
 'isdigit',
 'isidentifier',
 'islower',
 'isnumeric',
 'isprintable',
 'isspace',
 'istitle',
 'isupper'
 """
"\n'isalnum',\n 'isalpha',\n 'isascii',\n 'isdecimal',\n 'isdigit',\n 'isidentifier',\n 'islower',\n 'isnumeric',\n 'isprintable',\n 'isspace',\n 'istitle',\n 'isupper'\n "