[python] tuple, Dictionary, Set, defaultdict

markyang92·2021년 4월 23일
0

python

목록 보기
12/43
post-thumbnail

Tuple

  • 특징
    • 순서(idx) O
    • 중복 값 O
    • 수정 X
    • 삭제 X
  • Tupple이 mutable이지 각 element (list)는 immutable!!!

선언, 사용

  1. a = ( )

  2. a = (1,)
    2.1 주의! a = (1) 시, int 로 인식
    2.2 주의! self.name = name, <--마지막 ',' 시, Tuple 로 인식

class BasicClass():
    def __init__ (self, name):
        self.name=name,   # <--- name(str) -> 튜플화 되어 저장됨, self.name=(name)


a = () 	# 튜플 선언

b = (1)	# want: 튜플에 원소 하나 -> 하지만 int로 인식됨
print(b)
print(type(b))
=== 출력 ===
1
<class 'int'>
  • b = (1) 로 하면 int로 인식

  • 튜플에 원소 하나일 때는 b = (1 , ) 식으로 써야 튜플로 인식


자료형 상관 없음

c = (11, 12, 'Alice', 'Base')

튜플 내 튜플 가능

d = (11, 12, ('alice', 'gray'))

print(d[0])
print(d[-1][0])
=== 출력 ===
11
alice

tuple -> list

리스트로 변환

a = (1, 2, 3)
b = list(a)
print(b)
=== 출력 ===
[1, 2, 3]

Packing & UnPacking

  • bfs 에서 아주 유용함
t = ('foo', 'bar', 'baz', 'qux')

print(t)
# 이게 그냥 패킹


# 언패킹
(x1, x2, x3, x4) = t 
print(x1, x2, x3, x4)	# foo bar baz qux
print(type(x1))		# <class 'str'>
  • 언패킹: (x1, x2, x3, x4) = t
    • (x1, x2, x3, x4) <== t 가 언패킹

지원 메서드

  • ['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']

dict

선언

a = dict()
a = {} # 이 방법은 비추천 a = { 'val1', 'val2' } 로 하면 set type

# a = { 'key': 'value" }

b = {
    'name': 'yang',
    'city': 'seoul',
    'grade': [4.0, 4.5, 3.2],
    'Status': True
}

c = { 0: 'hello', 10: 'world' }
print(c[0])   -> 'hello'
print(c[10])  -> 'world'
  • key: value로 이루어져 있다.
  • Key 중복 XX
  • Key 숫자 가능
  • Valuelist도 가능
    • 'arr': [1, 2, 3, 4]

N번 'x y' 형태로 삽입

  • 알고리즘 문제를 풀다보면 아래와 같이 N번의 입력을 예고하고 X Y 형태로 값을 줄때가 있는데
    • 즉각 dict()X: key, Y: value 로 넣을 수 있다.
readl=sys.stdin.readline
vil=dict( map(int,readl().strip().split() for_ in range(N) )
print(vil)
# ==== 입력 ==== #
3
1 0
2 21
4 0
# ==== 출력 ==== #
{1: 0, 2: 21, 4: 0}

새로운 키 삽입

a[key]=value

  • 제일 간단하게!
a={}
1. 야매: a[10]=None	# 모르겠으면 None이라도 넣을 것. 아무 것도 넣지않으면 익셉션 발생

  • Keyint 형도 가능
d=dict()

d[4]=2

print(d.get(4)) -> 2 출력

a[key].update: a[key]에 append

  • 가령 새로운 키 혹은 기존 키에 내용을 append 하고 싶은 경우!
a[key].update( 내용 )

  • 예를 들어, 그래프를 저장하는 큰 2차원 list에서 각 내용이 dict()인 경우
    • e.g, a[1]={2: 4, 3:5}
      • a그래프의 Vertex 1 --- 4 ---> Vertex 2
        • 1 to 2, 가중치 4
      • a그래프의 Vertex 1 --- 5 ---> Vertex 3
        • 1 to 3, 가중치 5


  • 입력
6 7
1 2 4
1 3 2
2 4 4
2 5 5
3 5 4
4 6 1
5 6 2

  • maps list에 넣는 코드
maps=[ dict() for _ in range(V+1) ]
for i in range(0,E):
    V1, V2, cost=map(int, readl().strip().split())
    maps[V1].update({V2:cost})


del a[key][key2]

  • 위에서 a[key].update({V2:cost}) 로 업데이트 했다면,
  • del a[key][V2] 하면된다.

Key 이용 Value 얻기

  1. 야매: b['name'] # 없으면 exception 발생
  2. 정석: b.get('name') # 없으면 None
b = {
    'name': 'yang',
    'city': 'seoul',
    'grade': [4.0, 4.5, 3.2],
    'Status': True
}    

1. 야매 
try:
    print(b['name'])	# yang
    print(b['grade'][0])
except:
    print("Key_Error")
    
2. 정석
print(b.get('name'))	# 키가 없으면 None 출력
  • official: <dict>.get('key')
    • e.g., d.get('key')
    • 또한 <dict>.get('key')Exception Handling!

Key 중복

b={
    'name':'yang',
    'city': 'seoul',
    'grade': [4.0,4.5],
    'status': True,
    'name': 'donghyeon' <- 'name' key 중복
}


print(b.get('name'))
    
=== 출력 ===
donghyeon  <- 'name' key 마지막에 담긴 내용만 나옴

Key 조회

전체 키 조회

  1. 정석 : a.keys() # 키 들만 조회함 -> <class 'dict_keys'>(['key1', 'key2', ... ])
  2. for k in a
dict_keys(['name', 'city', 'grade', 'status'])
['name', 'city', 'grade', 'status']
a = dict()

for k in a:
    print(k)

순회

  • b.keys() 로 key iter를 얻어서 순회

더 간결하게는 아래와 같이 바로 b.keys()

d=dict()
d[4]=2

for i in d.keys():
    print(i, d.get(i))
    
더 간단하게는

for k in d:
    print(k, d[k])

특정 키 조회 (T|F)

  1. if a.get('key') == None:
  2. if 'key' not in a:
if key not in a:
    a[key] = [] # list 부여
    a[key] = value # value 부여
    

Value 조회

전체 Value 조회

<dict>.valuse()
  • a.values()로 전체 value들을 조회한다.

values()

  • values()
print( b.values() )
  • ['value1', 'value2', 'value3'...] 형태

values() 순회


items()

  • items()
print( b.items() )
  • [('key1', 'value1'), ('key2', 'value2') ...] 형태

items() 순회


기타 메서드

'dict'.pop('key')

  • pop('key')은 Key 값의 Value를 return 하고 Key의 값 제거
    • Key를 알아야 사용할 수 있음
b = {
    'name': 'yang',
    'city': 'seoul',
    'grade': [4.0, 4.5, 3.2],
    'Status': True
}   
print( b.pop('name') )	# Key 'name'의 'value'을 출력

print(b)		# 'name' Key와 그 key의 value가 사라짐


'dict'.popitem()

  • popitem()
    • 저장 된 키 중 제일 뒤에꺼 Pop

'dict'.clear() -> None

b={
    'name':'yang',
    'city': 'seoul',
    'grade': [4.0,4.5],
    'status': True,
    'name': 'donghyeon'
}

b.clear() clear!!!

print(b) -> 출력: {}
           

len('dict') -> 키 갯수


default 값 정해주기

  1. dict에 없던 'key''value'를 넣고 싶다.
# 기존
table=dict()
if table.get('new_key') == None: # new_key 라는 키를 가진 item이 있는지 찾아봄
    table['get']=0		 # None이 나올 경우 '키' 'value' 삽입

  • dict.setdefault( )

  • k 중복 시, append 하기

'dict'.copy() -> Shallow copy

vil=dict( map(int,readl().strip().split()) for _ in range(N) )
vil_copy=vil.copy()
print(id(vil[1]))
print(id(vil_copy[1]))
vil_copy[1]=10
print(id(vil[1]))
print(id(vil_copy[1]))
print(vil[1])
print(vil_copy[1])
# ==== 출력 ==== #
4345719056
4345719056
4345719056
4345719376
0
10

collections.defaultdict

from collections import defaultdict

from collections import defaultdict

d = defaultdict([bool|int|str|...])
  • defaultdict() <- '빌' 경우
    • 없는 키 조회시, Error

  • defaultdict(bool)
    • 없는 키 조회시, 자동으로 False

  • defaultdict(set)
    • 없는 키 조회시, 자동으로 빈 set()

순회

from collections import defaultdict
d=defaultdict()
for k,v in d.items():
    print(k)
    print(v)


set

  • 선언
a = set()
a = set([1,2,3,4])
a = set([1,2,'pet', 'hat'])
a = {'foo', 'bar', 'baz', 'qux' }	# { }에 Key: Value 형태가 아니면 set임
  • set의 특징
    • 중복 허용 X
    • idx 로 접근 불가

add : 추가

a = set([1,2,3,3,4])

print(a) # { 1, 2, 3, 4}

a.add(5)

print(a) # { 1, 2, 3, 4, 5 }

remove: 제거

a = set([1,2,3,3,4])

print(a) # { 1, 2, 3, 4}

a.remove(2)

print(a) # { 1, 3, 4 }

in : 값 조회

  • in set
a = set([1,2,3,4,5])

print(2 in a)	# True

pop: like-Queue pop

  • set은 기본적으로 오름차순 자동 정렬이기 때문에, pop을 쓰면 set내 가장 작은 것 부터 pop된다.

example_set=set()
example_set.pop()

예시:
-----------------------
add: 7
add: 9
add: 7
add: 30
add: 2
add: 7
add: 9
add: 25
------------------------
pop: 2
pop: 7
pop: 9
pop: 25
pop: 30

isdisjoint


issubset


issuperset

profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글