1. 순열

import itertools


color_list = ['red','blue','green']

nPr = itertools.permutations(color_list, 2)
print(list(nPr))
[('red', 'blue'), ('red', 'green'), ('blue', 'red'), ('blue', 'green'), ('green', 'red'), ('green', 'blue')]

순서를 고려하여 즉 (a,b)와 (b,a)를 다른 것으로 치고 뽑기 

itertools.permutations(list, n)

list에서 n개를 뽑는경우

 

 

2. 조합

nCr = itertools.combinations(color_list, 2)
print(list(nCr))
[('red', 'blue'), ('red', 'green'), ('red', 'orange'), ('blue', 'green'), ('blue', 'orange'), ('green', 'orange')]

순서를 고려하여 즉 (a,b)와 (b,a)를 같은 것으로 치고 뽑기

itertools.combinations(list, n)

list에서 n개를 뽑는경우

 

 

 

 

1. 무작위 정수추출 

randint(start, stop)

start 이상 stop 이하 범위의 정수 난수 생성

for i in range(10):
    print(i+1, 'th pick',random.randint(1, 10))
1 th pick 7
2 th pick 4
3 th pick 1
4 th pick 4
5 th pick 2
6 th pick 5
7 th pick 4
8 th pick 9
9 th pick 1
10 th pick 9

randrange(start, stop,step)

start 이상 stop 미만 step간격의 리스트에서 무작위 추출

 

for i in range(10):
    print(i+1, 'th pick',random.randrange(1, 10,3))
1 th pick 7
2 th pick 4
3 th pick 1
4 th pick 1
5 th pick 4
6 th pick 1
7 th pick 1
8 th pick 4
9 th pick 1
10 th pick 7

 

2. 리스트순서 섞기

 

shuffle(list)

리스트의 순서를 무작위로 섞어 반환

abcd = alpha_list[:4]

print(abcd)
for i in range(5):
    random.shuffle(abcd)
    print(i+1, 'th pick',abcd)
['a', 'b', 'c', 'd']
['c', 'a', 'd', 'b']
['d', 'a', 'b', 'c']
['d', 'a', 'c', 'b']
['a', 'c', 'd', 'b']
['b', 'a', 'd', 'c']

3. 리스트에서 무작위 1개 추출

 

choice(list)

print(alpha_list)

for i in range(10):
    print(i+1, 'th pick',random.choice(alpha_list))
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
1 th pick d
2 th pick f
3 th pick g
4 th pick a
5 th pick e
6 th pick f
7 th pick e
8 th pick a
9 th pick g
10 th pick c

가중치까지 부여

 

choices(list, weight_list)

print(alpha_list)
weight = list(range(1,11))

print(weight)
for i in range(10):
    print(i+1, 'th pick',random.choices(alpha_list,range(10)))
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
1 th pick ['g']
2 th pick ['j']
3 th pick ['h']
4 th pick ['i']
5 th pick ['c']
6 th pick ['h']
7 th pick ['g']
8 th pick ['f']
9 th pick ['f']
10 th pick ['j']

각각 가중치 부여 뒷쪽 알파벳에 가중치가 높아 뒷쪽이 많이 뽑힘

 

4. 리스트에서 무작위 n개 추출

 

random.sample(list,n)

abcd = alpha_list[:4]

print(abcd)
for i in range(5):
    print(i+1, 'th pick',random.sample(abcd,2))
['a', 'b', 'c', 'd']
['a', 'b']
['c', 'b']
['b', 'a']
['b', 'd']
['b', 'c']

 

코딩테스트를 준비하거나

어떠한 제품에 일련번호를 부여해야할 때 알파벳리스트가 필요할 때가 있다..

 

그럴 떄 string 모듈을 사용하면 용이하다.

print(string.ascii_lowercase)
print(list(string.ascii_lowercase))
print(list(string.ascii_lowercase)[:4])
abcdefghijklmnopqrstuvwxyz
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
['a', 'b', 'c', 'd']

소문자는 lowercase를

 

대문자는 uppercase를 이용한다

print(string.ascii_uppercase)
print(list(string.ascii_uppercase))
print(list(string.ascii_uppercase)[:4])
ABCDEFGHIJKLMNOPQRSTUVWXYZ
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
['A', 'B', 'C', 'D']

변수를 자동으로 생성하고 싶을때

예를 들어 a_1, a_2. a_3 ... 에 순차적으로 원하는 값을 할당하고 싶을 떄 사용

 

for i in range(10):
    globals()[f'a_{i}'] = i
    print(globals()[f'a_{i}'])
    print(globals()[f'a_{i}'] > 4)
    print(globals()[f'a_{i}'] * '원')
0
False

1
False2
False
원원
3
False
원원원
4
False
원원원원
5
True
원원원원원
6
True
원원원원원원
7
True
원원원원원원원
8
True
원원원원원원원원
9
True
원원원원원원원원원
a_8
8

 

 

변수명에 i들이 이쁘게 잘들어갔다.

연산도 그대로 적용된다. 

 

함수또한 마찬가지다

 

for문을 돌리고 하염없이 시간기다리기 싫을 떄

진행상황을 알고 싶다면 사용 

from tqdm.notebook import tqdm
import time
strat_time = time.time()

for i in tqdm(range(50)):
    time.sleep(1)
    
end_time = time.time()

sec = round(end_time - strat_time,1)
min_ =  int(sec//60)
sec = int(sec % 60)

print(f'반복문의 실행은 {min_}{sec}초가 걸렸습니다.')
반복문의 실행은 050초가 걸렸습니다.

포문을 실행할 때 반복을 실시할 리스트류에 tqdm 을 씌워주면

진행중에 위와 같은 창이 뜨고 실행되게된다

 

1번은 진행 퍼센테이지

2번은 진행한시간

3번은 남은시간

4번은 한 반복이 걸리는 평균시간을 말한다..

 

tqdm모듈을 사용하면 진행상황과 남은 시간을 예측할 수 있어 시간배분이 효율적일 수 있다.

 

또한 

time 모듈의 time() 함수를 활용하면 현재의 초를 알려준다

 

이에 포문시작과 완료시간을 빼면 총 포문을 실행하는 데에 걸린시간을 알 수 있다,.

lambda

함수를 한줄에 정의하고 사용만 한다.코드의 간결함 메모리의 절약

람다 함수는 정의와 동시에 사용할 수 있음

 

 

lambda  매개변수 : 리턴값

print((lambda x : x**2)(2))
4

제곱을 해주는 함수를 정의하고 바로 숫자 2를 넣어 리턴값을 돌려받음

 

lambda 매개변수 : 리턴값 if 조건 else 리턴값

nums = list(range(-4,4))
print(nums)
print(list(map(lambda x :  '양수' if x >= 0 else '음수',nums)))
[-4, -3, -2, -1, 0, 1, 2, 3]
['음수', '음수', '음수', '음수', '양수', '양수', '양수', '양수']

 

map

리스트데이터의 각 원소에 함수를 적용하고 싶을 때 사용

map(각원소에 적용할 함수, 리스트 )

각 과일이름의 길이를 리턴

fruits = ['사과','바나나','포도','파인애플','귤']
print(map(len,fruits))
print(list(map(len,fruits)))
<map object at 0x0000013FDE88A7C0>
[2, 3, 2, 4, 1]

맵 함수만 적용하면 맵형태의 객체가 리턴되므로

리스트형태로 명시적 형변환을 실시

names = ['이우현','이종수','이병군','김나명']
list(map(lambda x : x[-2:],names))
['우현', '종수', '병군', '나명']

람다함수를 이용도 가능

 

list_2 = [[1,23,4],[21,24624,12321],[4718,82,29,300],[32,365,33]]
print(list(map(sum,list_2)))
print([sum(i) for i in list_2 ])
[28, 36966, 5129, 430]
[28, 36966, 5129, 430]

리스트 컴프리헨션과 같은결과

 

import pandas as pd
print(series_)
print(series_.map(lambda x : x**2))
print(series_**2)
0    0
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
dtype: int64
0     0
1     1
2     4
3     9
4    16
5    25
6    36
7    49
8    64
9    81
dtype: int64
0     0
1     1
2     4
3     9
4    16
5    25
6    36
7    49
8    64
9    81
dtype: int64

판다스 시리즈객체에 대해도 적용가능

filter

리스트에서 질의한 부분이 참인 경우만 리턴하는 함수

map과 같이 list로 명시적형변환 필요

시리즈에는 x

print(list_)
print('-'*30)
print(series_)
print('-'*30)
print(list(filter(lambda x: x>2,list_)))
print('-'*30)
print(series_[series_ > 2])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
------------------------------
0    0
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
dtype: int64
------------------------------
[3, 4, 5, 6, 7, 8, 9]
------------------------------
3    3
4    4
5    5
6    6
7    7
8    8
9    9
dtype: int64

시리즈에는 인덱싱으로 적용

딕셔너리

- 키 : 밸류 형태

- pandas와 큰 연관

- 머신러닝 파라미터적용시 많이 사용

- 리스트와 같이 가장많이 쓰이는 집합자료형

 

생성

dict1 = {'국어':100, '수학':90, '영어':80}
print(dict1)
dict1['국어'] = 95
dict1['통계'] = 100
print(dict1)
k = dict1.pop('통계')
print(dict1)
print(k) # 밸류가 나온다
{'국어': 100, '수학': 90, '영어': 80}
{'국어': 95, '수학': 90, '영어': 80, '통계': 100}
{'국어': 95, '수학': 90, '영어': 80}
100

인덱싱은 key를 이용해서 가능하고 새로운 key:value도 인덱싱을 사용하여 삽입가능하다.

pop 또한 key를 이용하고 뽑아낸 원소는 value가 반환된다.

슬라이싱은 불가능하다.

 

물론 문자:숫자가 아닌 다른 경우도 가능하다

 

 

keys , values, items

print(list(dict1.keys()))
print(list(dict1.values()))
print(list(dict1.items()))
print(list(dict1.items())[0])
['국어', '수학', '영어']
[95, 90, 80]
[('국어', 95), ('수학', 90), ('영어', 80)]
('국어', 95)

keys 는 key들을 반환한다.

values 는 value들을  반환한다.

items 는 key,value를 튜플로 묶은 쌍들을 반환한다.

for key, value in dict1.items():
    print('{}점수는 {}점 입니다'.format(key,value))
국어점수는 95점 입니다
수학점수는 90점 입니다
영어점수는 80점 입니다

이런 식으로 응용가능하다.

 

추후 게시할 pandas에 행을 추가할 때 주로 딕셔너리를 이용하기 때문에 잘 알아아 둘 필요가 있다.

 

 

in

print('국어' in dict1)
print('과학' in dict1)
True
False

 

get

print(dict1['과학'])
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-32-1a2cdb189a8b> in <module>
----> 1 print(dict1['과학'])

KeyError: '과학'

일반 인덱싱을 이용하면 오류

print(dict1.get('과학'))
print(dict1.get('과학',0))
None
0

get을 이용하면 none 혹은 디폴트로 지정한 녀석을 반환한다.

 

이를 응용하면 카운트할 때 쉽다.

c_list = ['a','a','c','c','c','a','a','c','a','a','a','b','b','b','b']

count_dic = {}
for spel in c_list:
    count_dic[spel] = count_dic.get(spel, 0) + 1
print(count_dic)
{'a': 7, 'c': 4, 'b': 4}

물론 리스트의 count기능을 사용할 수 있지만 리스트의 길이 혹은 문자열의 길이가 셀수없이 길어진다면 모든 경우를 카운트하기에는 무리가 있다. 

 

'python 기초' 카테고리의 다른 글

[python기초] tqdm for문 예상속도, time  (0) 2021.12.06
[ python 기초 ] lambda, map, filter  (0) 2021.08.27
[ python 기초 ] 셋 set  (0) 2021.08.19
[ python 기초 ] 튜플 tuple  (0) 2021.08.19
[ python 기초 ] 리스트 list  (1) 2021.08.19

 

- 중복을 허용하지 않고 

- 인덱싱과 슬라이싱 불가능

- 집합연산 용이

 

생성

set1 = {'a','b','c','d','e'}
print(set1)

set2 = {'a','b','c','d','e','a','a','g','k'}
print(set2)
{'c', 'b', 'a', 'd', 'e'}
{'c', 'g', 'b', 'a', 'd', 'k', 'e'}

 

{} 로 생성한다. 셋을 생성하면 중복된 원소들은 제거된다.

 

 

인덱스 슬라이스 불가

set1[0]
set1[:2]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-c38563f1af7a> in <module>
----> 1 set1[0]

TypeError: 'set' object is not subscriptable

불가능하다.

 

집합연산

set1 = {'a','b','c','d','e'}
set2= {'c','d','e','f','g'}


print('set1',set1)
print('set2',set2)
print('교집합 ',set1&set2)
print('합집합 ',set1|set2)
print('차집합 ',set2-set1)
print('합집합 - 교집합 ',set1^set2)
{'c', 'b', 'a', 'd', 'e'}
{'c', 'g', 'd', 'f', 'e'}
set1 {'c', 'b', 'a', 'd', 'e'}
set2 {'c', 'g', 'd', 'f', 'e'}
교집합  {'c', 'e', 'd'}
합집합  {'c', 'g', 'b', 'a', 'd', 'f', 'e'}
차집합  {'g', 'f'}
합집합 - 교집합  {'g', 'f', 'b', 'a'}

 

보통 중복을 없애는데 사용한다

튜플

 

- 값의 수정이나 변경, 추가, 제거가 불가능하다. 변경 불가능한 리스트라고 이해

- 하지만 리스트에서 튜플 튜플에서 리스트로 변경은 가능

- 인덱싱 슬라이싱 리스트와 동일

- 모듈이나 기본함수의 출력값의 형식으로 많이 산출됨 

 

생성

tuple_ = ('a','b','c','d')
print(tuple_)
('a', 'b', 'c', 'd')

인덱싱, 슬라이싱

print(tuple_[2])
print(tuple_[-1])
print(tuple_[:2])
print(tuple_[::-1])
c
d
('a', 'b')
('d', 'c', 'b', 'a')

리스트와 동일하게 인덱싱 슬라이싱 가능하고 슬라이싱의 결과는 튜플 형태로 출력된다.

 

수정 및 추가

tuple_[0] = 'A'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-72-c25b0f105887> in <module>
----> 1 tuple_[0] = 'A'

TypeError: 'tuple' object does not support item assignment

수정 및 추가 삭제가 불가능하다.

 

리스트로의 변환을 활용한 추가, 제거

words = ['apple', 'banana', 'python', 'list', 'woo','woo','Java', 'won']

tuple_2 = tuple(words)
print(tuple_2, type(tuple_2), sep='  /  ')
tuple_2 = list(tuple_2)
print(tuple_2, type(tuple_2), sep='  /  ')
tuple_2.append('g')
tuple_2 = tuple(tuple_2)
print(tuple_2, type(tuple_2), sep='  /  ')
('apple', 'banana', 'python', 'list', 'hye', 'woo', 'Java', 'won')  /  <class 'tuple'>
['apple', 'banana', 'python', 'list', 'hye', 'woo', 'Java', 'won']  /  <class 'list'>
('apple', 'banana', 'python', 'list', 'hye', 'woo', 'Java', 'won', 'g')  /  <class 'tuple'>

변경을 원하는 경우에는 먼저 리스트로 형변환 이후에 변경하고 다시 튜플로 변환하면 가능하다 

 

index, count

words = ('apple', 'banana', 'python', 'list', 'woo','woo','Java', 'won')


print('apple' in words)
print('grape' in words)

print(words.index('apple'))
print(words.count('woo'))
True
False
0
2

 

함수의 결과

nums = [3,56,6,2]

def base_stat(list_):
    return max(list_),min(list_)

base_stat(nums)
(56, 2)

튜플의 변경이 불가능하다는 특성 때문인지 함수의 반환결과는 튜플로 반환되는 경우가 많습니다.

import pandas as pd
df = pd.read_csv('address.csv')
df.shape
(3042, 2)

리스트란

 

- 파이썬 기본 자료구조 형태중 하나

- 값을 나열한 것

- 시퀀스데이터 (자료의 순서가 있는 것)

- 자료의 변경, 삭제 , 추가가 자유로움.

 

리스트만들기

letters1 = ['a','b','c']
letters2 = ['d','e','f']

리스트명 = [ 원소1, 원소2, 원소3 , ... ]

위와 같이

 

리스트명 = [ 원소1, 원소2, 원소3 , ... ] 이런 형식으로 리스트를 생성할 수 있다.

내부원소의 자료형이 통일될 필요는 없다.

 

리스트 인덱싱

원소 a b c d e
인덱스 0 1 2 3 4
letters1 = ['a','b','c','d','e']
print(letters1[0])
print(letters1[1])
print(letters1[2])

letters1[0] = 3
print(letters1)
a
b
c

[3, 'b', 'c', 'd', 'e']

파이썬 리스트의 인덱스는 0부터  시작하며 첫 원소부터 차례대로 대응된다.

만약 print(letters1[3]) 

이와 같이 리스트에 없는 인덱스의 원소를 요청했다면 오류가 발생된다.

 

인덱싱을 활용하면 자료의 변경이 쉽게 가능하다.

 

 

 

리스트 슬라이싱

print(letters1[:3])  # 처음부터 3번 원소 전까지
print(letters1[2:])  # 2번 원소 전부터 끝까지
print(letters1[2:3]) # 2번 원소 전부터 3번원소 전까지
print(letters1[2:3][0]) # 원소에 직접접근하려면

print(letters1[::2]) # 처음부터 끝까지 2칸씩 띄워서 홀수 번째 친구들 
print(letters1[1::2]) # 1번원소 전부터 끝까지 2칸씩 띄워서 짝수 번째 친구들
['a', 'b', 'c']
['c', 'd', 'e']
['c']
c

['a', 'c', 'e']
['b', 'd']

리스트의 일부를 잘라 리스트로 반환한다. 

 

이때 중요한 점은 리스트로 반환한다는 점이다. 

3번째 경우 슬라이싱의 결과도 원소의 갯수가 1인 리스트로 반환이 되기 때문에 원소에 직접 접근하고 싶다면 

4번째줄의 코드와 같이 인덱싱을 진행해주어야한다.

 

 

다중리스트

리스트안에 리스트가 있는경우

letters1 = ['a','b','c','d','e']
letters2 = [letters1, 'f', 'g']
print(letters2)
print(letters2[0][2])
[['a', 'b', 'c', 'd', 'e'], 'f', 'g']
c
원소 ['a', 'b', 'c', 'd', 'e'] f g
인덱스 0 1 2

c에 접근하고싶다면 먼저 letters2의 첫번째 원소인 letters1에  접근하고 해당 리스트에서 인덱스로 접근한다.

 

 

 

 

리스트 함수 

 

1. len

print(len(letters1))
print(len(letters2))
5
3

리스트의 길이를 반환해준다. 

다중리스트의 경우 내부리스트가 얼마나 길든 1로 계산한다.

 

2. 리스트 이어붙이기

letters1 = ['a','b','c']
letters2 = ['d','e','f']

print(letters1 + letters2)

nums1 = [1,2,3]
nums2 = [4,5,6]
print(nums1 + nums2)

print(nums1 * 3)
['a', 'b', 'c', 'd', 'e', 'f']
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 1, 2, 3, 1, 2, 3]

더하기 연산자로 이을 수 있다.

모든 원소가 숫자인 리스트도 각 인덱스에 대응하는 원소끼리의 연산이 아닌 두 리스트를 이은 리스트가 반환된다.

 

곱하기 연산자를 사용할 경우 곱하는 숫자만큼 리스트의 원소를 반복한 뒤 반환한다.

 

3. in

print('a' in letters1)
print('A' in letters1)
print('a' in letters2)
True
False
False

리스트에 해당하는 원소가 있으면 True 없으면 FALSE를 반환한다.

파이썬은 대소문자를 구분한다.

letters2에는 'a'가 있어보이지만 letters2에 있는 letters1에 a가 존재하는 것이다.

 

 

4. count

letters3 = ['a','a','b']
letters3.count('a')
2

리스트내의 일치하는 원소의 갯수를 세어준다

5. append

print(letters1)
letters1.append('f')
print(letters1)
['a', 'b', 'c']
['a', 'b', 'c', 'f']

리스트의 맨뒤에 새로운 원소를 삽입한다.

nums1 = [1,2,3]
nums2 = [4,5,6]
result = []

for i in range(len(nums1)):
    result.append(nums1[i]+nums2[i])
print(result)
[5, 7, 9]

이런식으로 빈리스트에 새로운 값들을 추가할 수도있다.

 

6. insert

맨뒤에 값을 추가하는 append와는 다르게 insert는 원하는 위치에 값을 삽입할 수 있다.

print(letters1)
letters1.insert(1,'A')
print(letters1)
['a', 'b', 'c', 'd', 'e']
['a', 'A', 'b', 'c', 'd', 'e']

7. pop 

print(letters1)
k = letters1.pop(1)
print(letters1)
print(k)
['a', 'A', 'b', 'c', 'd', 'e']
['a', 'b', 'c', 'd', 'e']
A

원하는 인덱스의 값을 빼내어 준다. 빼낸값을 저장할 수도 있다.

인덱스를 입력하지 않으면 제일 뒤의 값을 빼내어 준다.

이런식으로 값이 순환하게 할 수도 있다.

print(letters1)
k = letters1.pop(0)
letters1.append(k)
print(letters1)
['a', 'b', 'c', 'd', 'e']
['b', 'c', 'd', 'e', 'a']

 

8. remove

print(letters1)
letters1.remove('b')
print(letters1)
['a', 'b', 'c', 'd', 'e']
['a', 'c', 'd', 'e']

해당하는 원소를 삭제한다.

 

9. sort

nums = [5, 2, 22, 4, 5, 3, 7, 1]
words = ['apple', 'banana', 'python', 'list', 'woo','Java', 'won']

nums.sort()  #정수 정렬
words.sort()     #문자열 정렬

print(nums)
print(words)

nums.sort(reverse=True)  #정수 정렬
words.sort(reverse=True)     #문자열 정렬

print(nums)
print(words)
[1, 2, 3, 4, 5, 5, 7, 22]
['Java', 'apple', 'banana', 'list', 'python', 'won', 'woo']
[22, 7, 5, 5, 4, 3, 2, 1]
['woo', 'won', 'python', 'list', 'banana', 'apple', 'Java']

리스트 내의 원소들을 정렬하여 반환한다. 기본값은 오름차순이다.

 

 

 

10. reverse

words = ['apple', 'banana', 'python', 'list', 'woo','Java', 'won']
print(words)
words.reverse()
print(words)
['apple', 'banana', 'python', 'list', 'woo', 'Java', 'won']
['won', 'Java', 'woo', 'list', 'python', 'banana', 'apple']

리스트의 원소의 순서를 뒤집어 반환한다.

 

11. index

words = ['apple', 'banana', 'python', 'list', 'woo','woo','Java', 'won']
print(words.index('woo'))

words[words.index('woo')] = 'hye'
print(words)
4
['apple', 'banana', 'python', 'list', 'hye', 'woo', 'Java', 'won']

리스트안에 일치하는 원소의 첫번째 인덱스를 반환한다.

산출된 인덱스를 이용해서 원소를 변경도 가능하다.

리스트안에 일치하는 원소가 없다면 오류를 반환한다.

+ Recent posts