멋쟁이사자처럼 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 "