>백엔드 개발 >파이썬 튜토리얼 >Python의 dict 사전 구조 작업 방법

Python의 dict 사전 구조 작업 방법

高洛峰
高洛峰원래의
2017-03-02 17:15:121606검색

이 글에서는 Python의 dict 사전 구조의 연산 방법을 주로 소개합니다. 사전의 연산은 Python 입문 학습을 위한 기본 지식입니다.

1. 방법

1. 새 사전 만들기

1) 빈 사전 만들기

>>> dict1={} 
>>> dict2=dict() 
>>> dict1,dict2 
({}, {})

2) 새 값 생성 시 값 초기화

>>> dict1={1:'a',2:'b',3:'c'} 
>>> dict1 
{1: 'a', 2: 'b', 3: 'c'}

3) 튜플 사용


>>> dict1=dict([(1,'a'),(2,'b'),(3,'c')]) 
>>> dict1 
{1: 'a', 2: 'b', 3: 'c'}

2. 획득 방법

1) get(key) 사전에서 키에 해당하는 값을 가져옵니다. 및 반환 값


>>> dict1={1:'a',2:'b',3:'c'} 
>>> dict1.get(1) 
'a'

사전에 없으면 NoneType

>>> type(dict1.get(4)) 
<type &#39;NoneType&#39;>

필요한 키 값이 존재하지 않는 경우 다른 값을 지정하여 반환

>>> dict1.get(4,&#39;not found&#39;) 
&#39;not found&#39;

2), 키() 사전에 있는 모든 키 값을 가져오고 목록을 반환합니다

>>> dict1.keys() 
[1, 2, 3]

3), 값()은 해당 키() 메소드와 반환된 사전 모든 값 목록

>>> dict1.values() 
[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;]

4), items()는 (key, value)

>>> dict1.items() 
[(1, &#39;a&#39;), (2, &#39;b&#39;), (3, &#39;c&#39;)]

5), iterkeys(), itervalues(), iteritems()도 각각 모든 키, 값, (키, 값) 프리미티브를 얻습니다. 그러나 더 이상 목록을 반환하지 않고 반복자

>>> for key in dict1.iterkeys(): 
 print key 
1 
2 
3


3. 사전 값 설정 방법

1) 직접 방식은


>>> dict1[4]=&#39;d&#39; 
>>> dict1 
{1: &#39;a&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;, 4: &#39;d&#39;}

그런데 이 방식은 제가 원하는 키값이 add가 이미 사전에 있으면 원본을 덮어쓰게 됩니다. value

>>> dict1[4]=&#39;e&#39; 
>>> dict1 
{1: &#39;a&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;, 4: &#39;e&#39;}

2), setdefault(key, value) 이 방법의 장점 삽입된 키가 사전에 없으면 이를 사전에 삽입하고 값을 반환하고, 그렇지 않으면 사전에 있으면 기존 값을 반환하고

을 덮어쓰지 않는다는 것입니다.
>>> dict1 
{1: &#39;a&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;, 4: &#39;e&#39;} 
>>> dict1.setdefault(5,&#39;f&#39;) 
&#39;f&#39; 
>>> dict1.setdefault(5,&#39;g&#39;) 
&#39;f&#39; 
>>> dict1 
{1: &#39;a&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;, 4: &#39;e&#39;, 5: &#39;f&#39;}

4. 사전 삭제

1) pop(key) 지정된 키의 항목을 삭제하고 삭제된 항목의 값을 성공적으로 반환합니다. 존재하지 않으면 예외가 발생하므로 이 방법을 사용할 때는 키가 존재하는지 판단하거나 이 예외를 잡아야 합니다

>>> def pop_key(d,key): 
 try: 
 d.pop(key) 
 print "sucess" 
 except: 
 print "key is not in dict" 
>>> dict1 
{1: &#39;a&#39;, 2: &#39;b&#39;} 
>>> pop_key(dict1,3) 
key is not in dict


또는

>>> def sub_dict2(d,key): 
 if d.has_key(key): 
 d.pop(key) 
 print "sucess" 
 else:print "key is not in dict" 
 
>>> pop_key(dict1,3) 
key is not in dict

여기서 has_key(key)는 해당 키가 사전에 있는지 확인하는 것입니다. 대신 d에 키를 사용할 수도 있습니다

2) popitem()은 A(키, 값) 튜플을 삭제한다는 점을 제외하면 pop()과 유사합니다.

위 방법을 사용하면 다음과 같은 작업을 수행할 수 있습니다. 고급 사용법을 사용합니다

A. 2개의 목록을 통해 사전을 생성합니다. 첫 번째 목록은 모두 키이고 두 번째 목록은 모든 값입니다

>>> list1=[1,2,3] 
>>> list2=[&#39;a&#39;,&#39;b&#39;,&#39;c&#39;] 
>>> dict1=dict(zip(list1,list2)) 
>>> dict1 
{1: &#39;a&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;}


B. 사전의 자식 찾기

>>> dict1 
{1: 'a', 2: 'b', 3: 'c'} 
>>> dict1=dict([(1,&#39;a&#39;),(2,&#39;b&#39;),(3,&#39;c&#39;)]) 
>>> dict1 
{1: &#39;a&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;} 
>>> subkeys=[1,3] 
>>> def sub_dict(d,subkeys): 
 return dict([(k,d.get(k)) for k in subkeys if k in d]) 
 
>>> print sub_dict(dict1,subkeys) 
{1: 'a', 3: 'c'}

C. , 키는 새 사전의 값이 되고 값은 새 사전의 키가 됩니다. (값에 Repeat가 있는 경우 역방향 사전은 하나만 유지됩니다.

>>> def invert_dict(d): 
 return dict([(k,v) for v,k in d.iteritems()]) 
 
>>> print invert_dict(dict1) 
{&#39;a&#39;: 1, &#39;c&#39;: 3, &#39;b&#39;: 2} 
>>>

5. 기타 기본 방법

1 ) has_key(key) 키가 사전에 있는지 확인

2) copy()는 a를 반환합니다. 사전 사본 (사본은 얕은 사본입니다)

>>> d2={1:[1],2:[2],3:[3]} 
>>> d3=d2.copy() 
>>> d3[1].append(4) 
>>> d2[1] 
[1, 4]

전체 복사를 하려면 copy.deepcopy(a)를 사용해야 합니다

>>> d2={1:[1],2:[2],3:[3]} 
>>> import copy 
>>> d3=copy.deepcopy(d2) 
>>> d3[1].append(4) 
>>> print d2[1] , d3[1] 
[1] [1, 4]

3) clear() dict 지우기

4) update(d)는 하나의 사전을 사용하여 다른 사전을 업데이트합니다. 이는 병합과 다소 유사합니다. 두 개의 사전

>>> dict1={1: &#39;a&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;} 
>>> dict2={1:&#39;x&#39;,4:&#39;y&#39;} 
>>> dict1.update(dict2) 
>>> dict1 
{1: &#39;x&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;, 4: &#39;y&#39;} 
>>>

2.

사전

1. dict

>>> d 
{&#39;a&#39;: &#39;aa&#39;, &#39;c&#39;: &#39;cc&#39;, &#39;b&#39;: &#39;bb&#39;} 
>>> for i in d: 
 print i,d[i] 
 
a aa 
c cc 
b bb

2. items() 사용

>>> for i,v in d.items(): 
 print i,v 
 
a aa 
c cc 
b bb


물론 이렇게 할 수도 있습니다

>>> for (i,v) in d.items(): 
 print i,v 
 
a aa 
c cc 
b bb

이 두 가지 방법(괄호 포함 및 제외)의 효율성은 사전 크기가 200 이하일 때 괄호가 더 빠르며, 200 이상이면 괄호가 없을 때 속도가 조금 더 빠르다고 하는데 구체적으로 테스트하지는 않았습니다. .

3.iteritems()
(더 좋은 방법인 것 같아요)

>>> for k,v in d.iteritems(): 
 print k,v 
 
a aa 
c cc 
b bb

그 외도 있어요 순회 방법은 이 3개면 충분하다고 생각합니다

3. 약간의 고급 사용법

1. >

일반적으로 사전은 일대일 매핑이 이루어지지만 책과 같이 일대다 매핑이 ​​필요한 경우 일부 단어가 나타나는 페이지 수를 세어야 합니다. 그런 다음 list를 dict의 값으로 사용할 수 있습니다. 이는 setdefault() 메서드


>>> d={&#39;hello&#39;:[1,4,9],"good":[1,3,6]} 
>>> d 
{&#39;good&#39;: [1, 3, 6], &#39;hello&#39;: [1, 4, 9]} 
>>> d.setdefault(&#39;good&#39;,[]).append(7) 
>>> d 
{&#39;good&#39;: [1, 3, 6, 7], &#39;hello&#39;: [1, 4, 9]} 
>>> d.setdefault(&#39;bad&#39;,[]).append(2) 
>>> d 
{&#39;bad&#39;: [2], &#39;good&#39;: [1, 3, 6, 7], &#39;hello&#39;: [1, 4, 9]} 
>>>

를 사용하여 수행할 수 있습니다.

当然,如果写成一个函数话,就可以更方便的使用,
我们也可以利用set来代替list


>>> def addFunc(d,word,pag): 
 d.setdefault(word,set()).add(pag) 
>>> d={&#39;hello&#39;:set([1,4,9]),"good":set([1,3,6])} 
>>> addFunc(d,&#39;hello&#39;,8) 
>>> d 
{&#39;good&#39;: set([1, 3, 6]), &#39;hello&#39;: set([8, 1, 4, 9])} 
>>> addFunc(d,&#39;bad&#39;,8) 
>>> d 
{&#39;bad&#39;: set([8]), &#39;good&#39;: set([1, 3, 6]), &#39;hello&#39;: set([8, 1, 4, 9])}

2、利用字典完成简单工厂模式
字典的value不单单只是一些常见的字符串,数值,还可以是类和方法,比如我们就可以这样来实现简单工厂模式

>>> class cat(object): 
 def __init__(self): 
 print &#39;cat init&#39; 
>>> class dog(object): 
 def __init__(self): 
 print &#39;dag init&#39; 
>>> d={&#39;cat&#39;:cat,&#39;dog&#39;:dog} 
>>> def factoryFunc(d,name): 
 if name in d: 
 return d[name]() 
 else: 
 raise Exception("error") 
>>> cat=factoryFunc(d,&#39;cat&#39;) 
cat init

另外一个例子,利用变量来控制执行的函数

>>> def deal_cat(): 
 print &#39;cat run!!&#39; 
 
>>> def deal_dog(): 
 print &#39;dag run!!&#39; 
 
>>> d={&#39;cat&#39;:deal_cat ,&#39;dog&#39;:deal_dog } 
>>> animal=&#39;cat&#39; 
>>> d[animal]() 
cat run!!


更多Python的dict字典结构操作方法相关文章请关注PHP中文网!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.