Python

list/lambda/numpy/pandas/matplotlib

kakaroo 2022. 2. 2. 12:41
반응형

파이썬

 

''.join(myList) //list의 item을 합쳐 문자열로 반환한다

//리스트 타입이 숫자인 경우에는 아래와 같이 map(str, 리스트이름)을 사용해서 리스트를 문자열로 합칠 수 있다.
alist = list(range(10))
print(alist)
s = ''.join(map(str,alist))


map()함수
👉map(f, iterable)은 함수(f)와 반복가능한(iterable) 자료형을 입력받고, 입력받은 자료형의 각 요소를 함수(f)가 수행한 결과를 묶어서 반환하는 함수.
ex) list(map(int, l1)) => map 함수의 결과를 list로 묶어주지 않을 경우 객체로 변환된 위치만 반환

l1 = [2, 5, 6, 7, 8]
new_list = list(map(str, l1))
출력 결과 :
['2', '5', '6', '7', '8']

 


//깊은 복사
import copy
b_list = copy.deepcopy(a_list)

def func(s):
    return s.casefold() //모든 문자를 소문자로 만든다

mylist.sort(key=func)

//리스트의 모든 항목을 한번에 처리할 수 있는 함수 ex)map, filter 와 같은 리스트 메소드
//map : 주어진 리스트의 전체항목을 변환한 신규리스트를 생성
//filter: 구체적인 조건에 만족하는 항목들로 구성된 신규리스트를 생성
//reduce : 두 인수로 주어진 함수(반드시 2개의 인수여야 함)를 리스트내에 짝을 이루고 있는 이웃항목에 적용하여 연산처리를 하고 결과를 누적하여 다시 인수로 넘기는 과정을 반복
import functools
functools.reduce(함수, 리스트)

def add_func(a, b):
    return a-b

n = 5
a_list = list(range(1,n+1))

sum = functools.reduce(add_func, a_list) // (((1-2)-3)-4)-5

//lambda
lambda 인수들: 반환값

my_f = lambda x,y: x+y
::람다를 reduce와 함께 사용하면 강력하다


//리스트 함축
alist = ['*'*20 for _ in range(40)] //40 x 20 
==> print('\n'.join(['*'*20]*40))

//별표기호 * 키워드 
//1. 튜플대입 (*2개이상 사용불가능)
a, *b, c = [1,2,3,4,5,6]
=> a=1 b=2,3,4,5 c=6
//2. unpacked list
ls = [1,2,3]
print(ls) //[1, 2, 3]
print(*ls)  // 1 2 3

//enum처럼
red, yellow, green, blue, black = range(1,6) //1부터 5

//리스트와 문자열 곱하기를 사용
alist = [0,1] *20
print(alist)
--> [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]

//함수를 리스트로
fn = [myfun1, myfu2, myfun3]
fn[0]() //myfun1 호출

//가변길이 인수리스트 *args 리스트
def avg(*args):
    return sum(args)/len(Args)
avg(10,20,30)

//키:값 쌍으로 구성된 딕셔너리 형태의 가변인수 **kwargs
def pr_named_vals(**kwargs):
    for k in kwargs:
        print(k, ':',  kwargs[k])
>>> pr_named_vals(a=10, b=20, c=30)
a : 10
b : 20
c : 30


//커맨드 라인 인수 접근
import sys
>>> python noname.py arg1 arg2 arg3
-> 파일이름이 sys.argv[0] 으로 들어가며 순차적으로 arg1 : sys.argv[1] ...

//포매팅 연산자 %
//텍스트 포매팅  %[-][너비][.정밀도]c : -는 왼쪽자리맞춤, 정수를 출력하는 경우 정밀도의 모자란 부분은 0으로 채워진다
a, b = 10, 25
print('Amount is %10.5d' %(a+b)) //     00035

//포매팅 연산자의 변수-너비 출력  (너비값이 변수로 먼저 나옴)
print('Here is a number:%*d' %(3, 17)) //3이 너비, 17이 값
>>>Here is a number: 17


//format (전역 format 함수) - 인수는 값,포맷 
format(33.141592, '7.3f') //너비 7은 소수점 포함해서 7자리, 정밀도(소수점 다음의 수)에 f가 붙으면 정밀도 자리는 소숫점자리수를 나타냄
>>> 33.142
format(33.141592, '7.3') //f가 없으면 정밀도(소숫점 다음의 수)자리만큼 숫자가 출력됨. 331만 채택, 41592는 버려짐
>>>   33.1

//format 메소드   (위에서 나온 전역 format 함수는 한번에 단 하나의 출력필드포맷만 가능하지만, format 메소드를 사용하면 인수를 복수개 설정이 가능하다.
//포맷이_지시된_문자열.format(인수들) //인수는 튜플, 중괄호 기호를 사용한다.
print('{} : {}'.format('A', 100))
///A : 100
print('{0}, {3}, {1}'.format(10,20,30,40)) //{} 에 인덱스를 넣음
///10, 40, 20
print('**{:10}**{:2}**'.format(777,999)) //너비를 나타낼때 콜론(:)을 사용, 너비값이 값의 길이보다 작을 경우에는 설정한 너비는 무시되고, 값의 길이가 너비가 된다.
///**       777**999**
print('**{1:10}**{0:2}**'.format(777,999)) //인덱스를 사용해 순서를 바꿔 출력
///**       999**777**

print('{:*>10}'.format('abc')) //*: 빈칸은 '*'로 채운다  >:우측정렬(^:center)  10:너비
>>>*******abc

//기호문자 : + 숫자를 앞에 다르게 표현하기 위함
//+:양수에 '+'를 표시, -:기본설정으로 양수에 '+'는 표시하지 않는다. (blank space):자리맞춤을 위한 공백
print('Result:{: },{:+},{:-}'.format(25,25,25))
>>>Result: 25,+25,25

fss = '{:10,.3f}\n{:10,.3f}' // ','는 천의 자리마다 ','를 나타냄
print(fss.format(22.1,10000.007))
>>>    22.100
>>>10,000.007


//정밀도 지시자를 사용하면 문자열을 잘라낼수 있다.
fss='{:*<12.6}' //좌측정렬, 너비보다 작은 빈문자열은 *로 채운다. 총 12너비만큼 출력하되, 정밀도가 6이므로 입력받는 문자열의 6자리만 출력함
print(fss.format('ABCDEFGHI'))
>>>ABCDEF******

//변수-너비출력  : 뒤에 중괄호 기호 쌍을 넣는다.   (데이터 값이 인수로 먼저 나옴, 포매팅연산자의 변수-너비출력과 순서가 반대다)
print('Num:{:{}.{}}'.format(33.141592, 10, 4))
>>>Num:     33.14


//numpy : 속도가 빠르다
import numpy as np
from time import time

def benchmark(n) :
    t1 = time()
    alist = list(range(1, n+1))
    sum(alist)
    t2 = time()
    print('Time: ', t2-t1)
    
    
    t1 = time()
    a = np.arange(1,n+1)
    np.sum(a)
    t2 = time()
    print('2nd Time: ',t2-t1)

benchmark(1_000_000)

넘파이 함수
arange(start=None, end, step) //start가 없으면 0부터
linspace(beg, end, num=50, endpoint=True, dtype=None) //arange와 유사하지만, 정수뿐 아니라 부동소수점도 다룬다
empty //초기화 되지 않은 배열
eyes //대각선에 1이 있는 배열, 다른셀은 0
ones //모두 1로 초기화한 배열
zeros //모두 0으로 초기화한 배열
full //배열의 모든 위치에 특정 값으로 채운 배열
fromfunction(func, shape, dtype='float')

//numpy array를 만드는 방법 (data는 리스트 혹은 튜플로..
numpy.array(data, dtype=None, order='K')  //'K':기본값, 'C':행-우선, 'F'-열-우선

a= np.array(([1,2,3], [-1,-2,-3])) //혹은 a= np.array([[1,2,3], [-1,-2,-3]])
print(a)
>>>[[ 1  2  3] //2차원 배열
>>> [-1 -2 -3]]
 
a= np.array([[1,2,3], [-1,-2,-3,4]]) //항목의 크기가 다를 경우
print(a)
>>>[list([1, 2, 3]) list([-1, -2, -3, 4])] //1차원 배열이 됨

a = np.linspace(1, 5, num=5)
print(a)
>>>[1. 2. 3. 4. 5.]

a = np.linspace(1, 5, num=5, dtype=np.uint8)
print(a)
>>>[1 2 3 4 5]

a = np.empty((2,2), dtype=np.uint8) //param1은 정수 또는 튜플
print(a)
>>>[[1 0] //초기화 되지 않았기 때문에 결과값은 다를수 있다.
     [0 0]]

a = np.eye(4,dtype=np.uint8) //param1:행의 갯수 param2:열의 갯수(param2를 입력하지 않으면 param1과 같은 수로 입력됨)
print(a)
>>>[[1 0 0 0]
    [0 1 0 0]
     [0 0 1 0]
     [0 0 0 1]]

a = np.eye(4, 5, dtype=np.uint8)
print(a)
>>>[[1 0 0 0 0]
     [0 1 0 0 0]
     [0 0 1 0 0]
     [0 0 0 1 0]]

a = np.ones((2,4), dtype=np.bool) //param1은 정수 또는 튜플
print(a)
>>>[[ True  True  True  True]
     [ True  True  True  True]]

a = np.ones(4, dtype=np.bool)
print(a)
>>>[ True  True  True  True]

a = np.full(5, 11, dtype=np.uint8) //param1은 정수 또는 튜플, param2는 fill_value
print(a)
>>>[11 11 11 11 11]

a = np.full(5, 'Kim')
print(a)
a[0] = 'Park' //문자열 크기가 3으로 고정됨
print(a)
>>>['Kim' 'Kim' 'Kim' 'Kim' 'Kim']
   ['Par' 'Kim' 'Kim' 'Kim' 'Kim']
   

a = np.fromfunction(lambda a,b : a+b, (2,2), dtype=np.uint8)
print(a)
>>>[[0 1]
 [1 2]]
   
a = np.arange(16).reshape(4,4) //reshape size가 안 맞으면 error!
print(a)
>>>[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]

a = np.fromfunction(lambda a,b: a*4 + b, (4,4), dtype=np.uint16) //위 결과와 같다
print(a)

//numpy 고급 수학 연산 함수 -> matplotlib

//pandas :금융 데이터 분석을 목적으로 개발, 구조화된 데이터를 쉽고 빠르게 가공할 수 있는 자료형과 함수를 제공
import pandas as pd

s = pd.Series([10,20,30,40,50])
s.index.name = 'ID1'
s.index = (['A','B', 'C','D', 'E'])
s.name = 'Eng'

t = pd.Series([-10,-20,-30,-40,-50])
t.index.name = 'ID2'
t.index = (['A','B', 'C','D', 'E'])
t.name = 'Minus'

df = pd.DataFrame({s.name: s, t.name:t})
print(df)
   Eng  Minus
A   10    -10
B   20    -20
C   30    -30
D   40    -40
E   50    -50


#리스트를 이용한 데이터 프레임 생성
columns = ['kospi', 'kosdaq']
index = list(range(2014,2019))
rows = [[1915,542], [1961,682], [2026,631], [2467,798], [2041,675]]
df = pd.DataFrame(rows, columns=columns, index=index)
print(df)
>>>      kospi  kosdaq
2014   1915     542
2015   1961     682
2016   2026     631
2017   2467     798
2018   2041     675

for i in df.index:
    print(i ,df['kospi'][i], df['kosdaq'][i])
>>>2014 1915 542
2015 1961 682
2016 2026 631
2017 2467 798
2018 2041 675

반응형

'Python' 카테고리의 다른 글

Series  (0) 2023.03.21
파이썬 - 파일, 디렉토리  (0) 2023.03.07
Pandas  (0) 2022.12.09