본문 바로가기

PYTHON-BACK

#파이썬 기초 6일차_1

728x90

 

2.8 Dictionary에서 값(Value)만 추출하기

values() - 벨류만 들고오기

l = [('a',1), ('b',2)]
d = dict(l)

print(d.values())
print(list(d.values())) # 데이터를 기반으로 리스트라는 인스턴스를 하나 새로 만들어서 그것을 리턴해서 출력

dict_values([1, 2])

[1, 2]

 

각 이름별로 출생한 사람의 수

names = {'Mary':10999, 'Sams':2111, 'Aimy':9778, 'Tom':20245, 'Michale':27115, 'Bob':5887, 'Kelly':7855}
vals = names.values()
print(vals)

dict_values([10999, 2111, 9778, 20245, 27115, 5887, 7855])

vals_list = list(vals)
ret = sum(vals_list)
print('출생아수 총계: %d' %ret)

출생아수 총계: 83990

 

sum같은 일부 간단한 함수들은 파이썬 자체 내장 되어있어서 그냥 사용 가능하다, 더 복잡한 계산들은 math, numpy같은 라이브러리 모듈들을 불러와서 사용( 각 모듈별로 속도 차이가 있다. )

2.9 Dictionary에서 모든 요소 추출하기

items - 대입하는 값의 모든 아이템(여기서는 키와 벨류)를 다 가져옴

l = [('a',1), ('b',2)]
d = dict(l)
print(d.items())

print(list(d.items()))

dict_items([('a', 1), ('b', 2)])

[('a', 1), ('b', 2)]

items = names.items()
print(items)

dict_items([('Mary', 10999), ('Sams', 2111), ('Aimy', 9778), ('Tom', 20245), ('Michale', 27115), ('Bob', 5887), ('Kelly', 7855)])

for item in items:
    print(item)

('Mary', 10999)
('Sams', 2111)
('Aimy', 9778)
('Tom', 20245)
('Michale', 27115)
('Bob', 5887)
('Kelly', 7855)

for item in items:
    print("Key: {} \t Value: {}".format(item[0], item[1]))

Key: Mary   Value: 10999
Key: Sams   Value: 2111
Key: Aimy   Value: 9778
Key: Tom   Value: 20245
Key: Michale   Value: 27115
Key: Bob   Value: 5887
Key: Kelly   Value: 7855

for key_, value_ in items:
  print("Key: {} \t Value: {}".format(key_, value_))

Key: Mary   Value: 10999
Key: Sams   Value: 2111
Key: Aimy   Value: 9778
Key: Tom   Value: 20245
Key: Michale   Value: 27115
Key: Bob   Value: 5887
Key: Kelly   Value: 7855

2.10 Dictionary 내부 원소를 조회하고 Tuple/Set 반환하기

l = [('a',1), ('b',2)]
d = dict(l)

# 튜플로 데이터 변환
print(tuple(d.items()))
print(tuple(d.keys()))
print(tuple(d.values()))

(('a', 1), ('b', 2))
('a', 'b')
(1, 2)

# set로 데이터 변환
print(set(d.items()))
print(set(d.keys()))
print(set(d.values()))

{('a', 1), ('b', 2)}
{'b', 'a'}
{1, 2}

2.11 Dictionary에 특정 Key가 존재하는지 확인하기

l = [('a',1), ('b',2)]
d = dict(l)
print(d['c'])

KeyError: 'c' # 키가 없어서 에러 발생

 

키가 존재하면 가져오고 없으면 default value 출력하라(예외처리)

l = [('a',1), ('b',2)]
d = dict(l)

print(d.get("c", "default value"))

default value

 

조회하고 없으면 d값에 디폴트로 세팅까지해주기

l = [('a',1), ('b',2)]
d = dict(l)

# 조회하고 없으면 세팅하기
d.setdefault("c", "default value")

print(d['c'])
print(d)

default value

{'a': 1, 'b': 2, 'c': 'default value'}

 

표준 입력받기 input

표준 출력하기 print

names = {'Mary':10999, 'Sams':2111, 'Aimy':9778, 'Tom':20245, 'Michale':27115, 'Bob':5887, 'Kelly':7855}
k = input('이름을 입력하세요: ')

if k in names:
   print('이름이 <%s>인 출생아수는 <%d>명 입니다.' %(k, names[k]))
else:
   print('자료에 <%s>인 이름이 존재하지 않습니다.' %k)

이름을 입력하세요: Sams

이름이 <Sams>인 출생아수는 <2111>명 입니다.

2.12 Dictionary 정렬하기

sorted함수 - 전달한 데이터는 그대로 두고, 리턴을 할 때 해당 내용만 정렬해서 정리함

문자열이 가진 매소드

 

names = {'Mary':10999, 'Sams':2111, 'Aimy':9778, 'Tom':20245, 'Michale':27115, 'Bob':5887, 'Kelly':7855}
ret1 = sorted(names)
print(ret1)
print(names)

['Aimy', 'Bob', 'Kelly', 'Mary', 'Michale', 'Sams', 'Tom'] # 키만 가진 상태로 리턴됨

{'Mary': 10999, 'Sams': 2111, 'Aimy': 9778, 'Tom': 20245, 'Michale': 27115, 'Bob': 5887, 'Kelly': 7855}

 

키값의 순서대로 정렬(f1기준)

def f1(x):
   return x[0]

def f2(x):
   return x[1]

ret2 = sorted(names.items(), key=f1) #items를 하면 키, 벨류 두개의 데이터를 가져오니, 정렬 기준을 f1으로 해라
print(ret2)

[('Aimy', 9778), ('Bob', 5887), ('Kelly', 7855), ('Mary', 10999), ('Michale', 27115), ('Sams', 2111), ('Tom', 20245)]

 

벨류값의 크기순으로 정렬하라(f2기준)

ret3 = sorted(names.items(), key=f2)
print(ret3)

[('Sams', 2111), ('Bob', 5887), ('Kelly', 7855), ('Aimy', 9778), ('Mary', 10999), ('Tom', 20245), ('Michale', 27115)]

 

역정렬(reverse이용, f2의 역정렬)

ret4 = sorted(names.items(), key=f2, reverse=True)
print(ret4)

[('Michale', 27115), ('Tom', 20245), ('Mary', 10999), ('Aimy', 9778), ('Kelly', 7855), ('Bob', 5887), ('Sams', 2111)]

 

벨류만 꺼내서 정렬

ret5 = sorted(names.values())
print(ret5)

[2111, 5887, 7855, 9778, 10999, 20245, 27115]

 

벨류만 꺼내서 리버스 정렬(역정렬)

ret6 = sorted(names.values(), reverse=True)
print(ret6)

[27115, 20245, 10999, 9778, 7855, 5887, 2111]

 

3. Set

 

  • 일반적인 수학의 집합을 구현한 자료형
    • 집합에서 처리하는 산술식을 메서드로 제공하고 있다.
  • 집합은 동일한 값이 여러 번 나올 수 없으므로 원소를 Hash로 처리하여 유일성을 유지함
  • Dictionary와 동일하게 {}로 표기하지만 내부에 Value가 없고 Key만 존재한다.

3.1 set 생성하기

  • 빈 set은 반드시 set()로 생성

- {}는 dict 타입 처리용
- set 일 경우는 반드시 set()으로 빈 set 생성

 

s = set()
d = {}
print(type(s))
print(type(d))

<class 'set'>

<class 'dict'>

  • 리터럴이나 생성자로 set 만들기
l = set([1,2,3,'a','b'])
s = set("abc")
print(l)
print(s)

{1, 2, 3, 'b', 'a'}

{'b', 'c', 'a'}

 

- 리터럴로 생성

sl = {1,2,3}
print(sl)

{1, 2, 3}

3.2 set 기본 연산 처리

l = set([1,2,3,'a','b'])
s = set("abc")

 

합집합(둘 중 하나만 만족해도 상관없음 (A or B)

# 파이프(|)이용 (연산자 이용)

# 집합 연산 매소드 union 이용

u = l | s 
print(u)

u = l.union(s)
print(u)

{1, 2, 3, 'b', 'a', 'c'}

{1, 2, 3, 'b', 'a', 'c'}

 

교집합(A and B)

# & 이용

# 연산 매소드 intersection 이용

i = l & s
print(i)
i = l.intersection(s)
print(i)

 

차집합(A - B)

# - 이용

# 연산 매소드 difference 이용

d = l - s
print(d)

d = l.difference(s)
print(d)

{1, 2, 3}

{1, 2, 3}

 

집합에 대한 대칭 차집합

# ^ 이용

# symmetric_difference 이용

sd = l ^ s
print(sd)

sd = l.symmetric_difference(s)
print(sd)

{1, 2, 3, 'c'}

{1, 2, 3, 'c'}

3.3 집합연산을 통해 자기 내부 변경하기

ll = set([1,2,3,'a','b'])
ss = set("abc")

 

차집합을 계산한 후 ll에 업데이트

ll.difference_update(ss)
print(ll)

{1, 2, 3}

 

교집합을 계산한 후 ll에 업데이트

ll.intersection_update(ss)
print(ll)

{'b', 'a'}

 

대칭 차집합 계산한 후 ll에 업데이트

ll.symmetric_difference_update(ss)
print(ll)

{1, 2, 3, 'c'}

3.4 집합 원소 처리

s = set([1,2,3,'a','b'])

 

방법1) 새로추가한 원소를 집합에 넣어주는 것

# 원소 추가
s.add('c')
print(s)

{1, 2, 3, 'b', 'c', 'a'}

 

방법2) 새로 갱신하라(updata)를 이용, 갱신 내용이 기존에 들어있지 않으므로 추가되는 개념

s.update({4,5,})
print(s)

{1, 2, 3, 'b', 4, 5, 'c', 'a'}

 

원소 삭제

s = set([1,2,3,'a','b'])
s.remove('b')
print(s)

{1, 2, 3, 'a'}

 

없는 것을 remove하려하면 KeyError: '없는것' 이라고 나옴

 

pop() 개념 : 따로 지칭 안하면 맨 마지막꺼부터 꺼냄?? 집합에서는 pop이 앞에서 부터 나온다는 말이 있음 확인필요

s = set([1,2,3,'a','b'])
sp = s.pop()
print(sp)
print(s)

1

{2, 3, 'b', 'a'}

 

해당위치 삭제 필요할 때. 삭제할 것을 넣어주면 됨(discard)

sp = s.discard('a')
print(sp)
print(s)

None

{2, 3, 'b'}

 

remove는 키가 반드시 있어야 하지만 discard는 없어도 됨( remove는 키가 없음 에러가 뜨는데,  discard 는 키가 없음 None이라 출력함)

sp = s.discard('d')
print(sp)

None

3.5 집합 간의 관계 확인 연산자 및 메소드

issubset ss는 s의 부분집합이다.

 
s = set([1,2,3,'a','b'])
ss = set([1,2,3])
sss = set([1,2,3,4])

print(ss < s)
print(ss.issubset(s))
print(sss < s)

True

True

False # 여기서 알 수 있는 것은 갯수만을 가지고 판단하는것이 아니라 포함관계가 들어가 있는 것이다.

 

s = set([1,2,3,'a','b'])
ss = set([1,2,3,'a','b'])

print(ss <= s)
print(ss.issubset(s))

True

True

4. Frozenset

 
  • 집합 자료형에서는 변경가능한 set과 변경불가능한 frozenset을 제공함(고정된 값 유지)
  • set은 Dictionary의 키로 사용하지 못하므로 불변형을 제공하고 필요한 경우 frozenset으로 형변환을 해서 처리함

4.1 frozenset 생성하기

s = frozenset()

print(s)
print(type(s))

frozenset()

<class 'frozenset'>

s = frozenset([1,3,4])
l = frozenset([1,2,4])
print(s)
print(l)

frozenset({1, 3, 4})

frozenset({1, 2, 4})

4.2 set과의 차이

  • frozenset 은 변경불가의 자료형이므로 집합연산의 결과는 내부를 변경하지 않고 새로운 인스턴스 객체를 만듦
  • 집합연산 자체는 set과 동일하며, 집합연산을 하고 난 후에 다른 인스턴스를 생성하므로 원본 frozenset은 갱신되지 않음
s = frozenset([1,3,4])
l = frozenset([1,2,4])
u = s.union(l)
print(u)
i = s.intersection(l)
print(i)
d = s.difference(l)
print(d)

frozenset({1, 2, 3, 4})

frozenset({1, 4})

frozenset({3})

728x90

'PYTHON-BACK' 카테고리의 다른 글

#파이썬 기초 7일차_2  (1) 2024.07.05
#파이썬 기초 7일차_1  (1) 2024.07.05
#파이썬 기초 5일차_1  (1) 2024.07.03
#파이썬 기초 4일차_2  (1) 2024.07.02
#파이썬 기초 4일차_1  (0) 2024.07.02