>  기사  >  백엔드 개발  >  Python의 사전 컨테이너에 대한 심층적인 설명

Python의 사전 컨테이너에 대한 심층적인 설명

巴扎黑
巴扎黑원래의
2017-08-16 13:27:582026검색

사전

우리 모두는 모르는 단어의 정의를 찾기 위해 언어 사전을 사용해 본 적이 있습니다. 언어 사전은 특정 단어(예: Python)에 대한 표준 정보 세트를 제공합니다. 이 시스템은 정의 및 기타 정보를 실제 단어와 연결(지도)합니다. 관심 있는 정보를 찾으려면 단어를 핵심 위치로 사용하세요. 이 개념은 Python 프로그래밍 언어로 확장되어 사전이라는 특수 컨테이너 유형이 됩니다.

사전 데이터 유형은 여러 언어로 존재합니다. 데이터가 키 값과 연관되어 있기 때문에 연관 배열 또는 해시 테이블이라고도 합니다. 하지만 Python에서 사전은 좋은 개체이므로 초보 프로그래머라도 자신의 프로그램에서 쉽게 사용할 수 있습니다. 공식적으로 Python의 사전은 이종의 변경 가능한 매핑 컨테이너 데이터 유형입니다.

사전 만들기

이 시리즈의 이전 기사에서는 튜플, 문자열 및 목록을 포함하여 Python 프로그래밍 언어의 일부 컨테이너 데이터 유형을 소개했습니다(참고자료 참조). 이러한 컨테이너는 시퀀스 기반이라는 점에서 유사합니다. 즉, 이러한 컬렉션의 요소는 시퀀스에서의 위치에 따라 액세스됩니다. 따라서 a 라는 시퀀스가 ​​있으면 숫자 인덱스(예: a[0] ) 또는 조각(예: a[1:5] )을 사용하여 요소에 액세스할 수 있습니다. Python의 사전 컨테이너 유형은 순서가 지정되지 않은 컬렉션이라는 점에서 이 세 가지 컨테이너 유형과 다릅니다. 인덱스 번호를 사용하는 대신 키 값을 사용하여 컬렉션의 요소에 액세스합니다. 이는 목록 1에 표시된 것처럼 키와 해당 값을 모두 제공해야 하기 때문에 사전 컨테이너를 구성하는 것이 튜플, 문자열 또는 목록보다 조금 더 복잡하다는 것을 의미합니다.

목록 1. Python에서 사전 만들기, 1부

>>> d = {0: 'zero', 1: 'one', 2 : 'two', 3 : 'three', 4 : 'four', 5: 'five'}
>>> d
{0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five'}
>>> len(d)
>>> type(d)     # Base object is the dict class
<type &#39;dict&#39;>
>>> d = {}      # Create an empty dictionary
>>> len(d)
>>> d = {1 : &#39;one&#39;} # Create a single item dictionary
>>> d
{1: &#39;one&#39;}
>>> len(d)
>>> d = {&#39;one&#39; : 1} # The key value can be non-numeric
>>> d
{&#39;one&#39;: 1}
>>> d = {&#39;one&#39;: [0, 1,2 , 3, 4, 5, 6, 7, 8, 9]}
>>> d
{&#39;one&#39;: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}

이 예에 표시된 것처럼 Python에서 사전을 만들려면 중괄호와 콜론으로 구분된 키-값 조합을 사용합니다. 키-값 조합이 제공되지 않으면 빈 사전이 생성됩니다. 키-값 조합을 사용하면 하나의 요소로 구성된 사전이 생성되며, 필요한 크기까지 가능합니다. 모든 컨테이너 유형과 마찬가지로 내장된 len 메소드를 사용하여 컬렉션의 요소 수를 확인할 수 있습니다.

이전 예에서는 사전 컨테이너에 대한 또 다른 중요한 문제도 보여줍니다. 키는 정수로 제한되지 않으며 정수, 부동 소수점, 튜플 또는 문자열을 포함한 모든 불변 데이터 유형이 될 수 있습니다. 목록은 변경 가능하므로 사전의 키로 사용할 수 없습니다. 그러나 사전의 값은 모든 데이터 유형이 될 수 있습니다.

마지막으로 이 예는 Python에서 사전의 기본 데이터 유형이 dict 객체임을 보여줍니다. Python에서 사전 사용에 대해 자세히 알아보려면 목록 2에 표시된 대로 내장 도움말 해석기를 사용하여 dict 클래스에 대해 알아볼 수 있습니다.

목록 2. 사전에 대한 도움말 보기

>>> help(dict)on class dict in module __builtin__:
   dict(object)
| dict() -> new empty dictionary.
| dict(mapping) -> new dictionary initialized from a mapping object&#39;s
|   (key, value) pairs.
| dict(seq) -> new dictionary initialized as if via:
|   d = {}
|   for k, v in seq:
|     d[k] = v
| dict(**kwargs) -> new dictionary initialized with the name=value pairs
|   in the keyword argument list. For example: dict(one=1, two=2)
| 
| Methods defined here:
| 
| __cmp__(...)
|   x.__cmp__(y) <==> cmp(x,y)
| 
| __contains__(...)
|   x.__contains__(y) <==> y in x
| 
| __delitem__(...)
|   x.__delitem__(y) <==> del x[y]
...

dict 클래스에 대한 도움말에는 중괄호를 사용하지 않고 생성자를 사용하여 사전을 직접 만들 수 있다고 명시되어 있습니다. 사전을 생성할 때는 다른 컨테이너 데이터 유형보다 더 많은 데이터를 제공해야 하므로 이러한 생성 방법이 복잡하다는 것은 놀라운 일이 아닙니다. 그러나 Listing 3과 같이 실제로 사전을 사용하는 것은 어렵지 않습니다.

목록 3. Python에서 사전 만들기, 2부

>>> l = [0, 1,2 , 3, 4, 5, 6, 7, 8, 9] 
>>> d = dict(l)(most recent call last):
 File "<stdin>", line 1, in ?: can&#39;t convert dictionary 
 update sequence element #0 to a sequence
  
>>> l = [(0, &#39;zero&#39;), (1, &#39;one&#39;), (2, &#39;two&#39;), (3, &#39;three&#39;)]
>>> d = dict(l)
>>> d
{0: &#39;zero&#39;, 1: &#39;one&#39;, 2: &#39;two&#39;, 3: &#39;three&#39;}
>>> l = [[0, &#39;zero&#39;], [1, &#39;one&#39;], [2, &#39;two&#39;], [3, &#39;three&#39;]]
>>> d
{0: &#39;zero&#39;, 1: &#39;one&#39;, 2: &#39;two&#39;, 3: &#39;three&#39;}
>>> d = dict(l)
>>> d
{0: &#39;zero&#39;, 1: &#39;one&#39;, 2: &#39;two&#39;, 3: &#39;three&#39;}
>>> d = dict(zero=0, one=1, two=2, three=3) 
>>> d
{&#39;zero&#39;: 0, &#39;three&#39;: 3, &#39;two&#39;: 2, &#39;one&#39;: 1}
>>> d = dict(0=zero, 1=one, 2=two, 3=three): keyword can&#39;t be an expression

보시다시피 사전을 만들려면 키 값과 데이터 값이 필요합니다. 일치하는 키-데이터 값 쌍이 없기 때문에 목록에서 사전을 생성하려는 첫 번째 시도가 실패합니다. 두 번째와 세 번째 예는 사전을 올바르게 만드는 방법을 보여줍니다. 첫 번째 경우에는 각 요소가 튜플인 목록을 사용하고 두 번째 경우에도 목록을 사용하지만 그 안의 각 요소는 다른 목록입니다. 두 경우 모두 내부 컨테이너는 키와 데이터 값의 매핑을 얻는 데 사용됩니다.

dict 컨테이너를 직접 생성하는 또 다른 방법은 키와 데이터 값의 매핑을 직접 제공하는 것입니다. 이 기술을 사용하면 키와 해당 값을 명시적으로 정의할 수 있습니다. 이 방법은 중괄호를 사용하여 동일한 작업을 수행할 수 있기 때문에 실제로 덜 유용합니다. 또한 이전 예에서 보듯이 이 방법을 사용할 때는 키에 숫자를 사용할 수 없습니다. 그렇지 않으면 예외가 발생합니다.

사전 액세스 및 수정

사전을 만든 후에는 사전에 포함된 데이터에 액세스해야 합니다. 액세스는 목록 4에 표시된 것처럼 모든 Python 컨테이너 데이터 유형의 데이터에 액세스하는 것과 유사합니다.

清单 4. 访问 dictionary 中的元素

>>> d = dict(zero=0, one=1, two=2, three=3)
>>> d
{&#39;zero&#39;: 0, &#39;three&#39;: 3, &#39;two&#39;: 2, &#39;one&#39;: 1}
>>> d[&#39;zero&#39;]
>>> d[&#39;three&#39;]
>>> d = {0: &#39;zero&#39;, 1: &#39;one&#39;, 2 : &#39;two&#39;, 3 : &#39;three&#39;, 4 : &#39;four&#39;, 5: &#39;five&#39;}
>>> d[0]
&#39;zero&#39;
>>> d[4]
&#39;four&#39;
>>> d[6](most recent call last):
 File "<stdin>", line 1, in ?: 6
>>> d[:-1](most recent call last):
 File "<stdin>", line 1, in ?: unhashable type

可以看到,从字典(dictionary)中获取数据值的过程几乎与从任何容器类型中获取数据完全一样。在容器名后面的方括号中放上键值。当然,字典(dictionary)可以具有非数字的键值,如果您以前没有使用过这种数据类型,那么适应这一点需要些时间。因为在字典(dictionary)中次序是不重要的(dictionary 中数据的次序是任意的),所以可以对其他容器数据类型使用的片段功能,对于 字典(dictionary)是不可用的。试图使用片段或者试图从不存在的键访问数据就会抛出异常,指出相关的错误。

Python 中的字典(dictionary)容器也是易变的数据类型,这意味着在创建它之后可以修改它。如清单 5 所示,可以添加新的键到数据值的映射,可以修改现有的映射,还可以删除映射。

清单 5. 修改字典(dictionary)

>>> d = {0: &#39;zero&#39;, 1: &#39;one&#39;, 2: &#39;two&#39;, 3: &#39;three&#39;}
>>> d[0]
&#39;zero&#39;
>>> d[0] = &#39;Zero&#39;
>>> d
{0: &#39;Zero&#39;, 1: &#39;one&#39;, 2: &#39;two&#39;, 3: &#39;three&#39;}
>>> d[4] = &#39;four&#39;
>>> d[5] = &#39;five&#39;
>>> d
{0: &#39;Zero&#39;, 1: &#39;one&#39;, 2: &#39;two&#39;, 3: &#39;three&#39;, 4: &#39;four&#39;, 5: &#39;five&#39;}
>>> del d[0]
>>> d
{1: &#39;one&#39;, 2: &#39;two&#39;, 3: &#39;three&#39;, 4: &#39;four&#39;, 5: &#39;five&#39;}
>>> d[0] = &#39;zero&#39;
>>> d
{0: &#39;zero&#39;, 1: &#39;one&#39;, 2: &#39;two&#39;, 3: &#39;three&#39;, 4: &#39;four&#39;, 5: &#39;five&#39;}

清单 5 演示了几个重点。首先,修改数据值是很简单的:将新的值分配给适当的键。其次,添加新的键到数据值的映射也很简单:将相关数据分配给新的键值。Python 自动进行所有处理。不需要调用 append 这样的特殊方法。对于 dictionary 容器,次序是不重要的,所以这应该好理解,因为不是在字典(dictionary)后面附加映射,而是将它添加到容器中。最后,删除映射的办法是使用 del 操作符以及应该从容器中删除的键。

在清单 5 中有一个情况看起来有点儿怪,键值是按照数字次序显示的,而且这个次序与插入映射的次序相同。不要误解 —— 情况不总是这样的。Python 字典(dictionary)中映射的次序是任意的,对于不同的 Python 安装可能会有变化,甚至多次使用同一 Python 解释器运行相同代码也会有变化。如果在一个字典(dictionary)中使用不同类型的键和数据值,那么就很容易看出这一点,如清单 6 所示。

清单 6. 异构的容器

>>> d = {0: &#39;zero&#39;, &#39;one&#39;: 1}   
>>> d
{0: &#39;zero&#39;, &#39;one&#39;: 1}
>>> d[0]
&#39;zero&#39;
>>> type(d[0])
<type &#39;str&#39;>
>>> d[&#39;one&#39;]
>>> type(d[&#39;one&#39;])
<type &#39;int&#39;>
>>> d[&#39;two&#39;] = [0, 1, 2] 
>>> d
{0: &#39;zero&#39;, &#39;two&#39;: [0, 1, 2], &#39;one&#39;: 1}
>>> d[3] = (0, 1, 2, 3)
>>> d
{0: &#39;zero&#39;, 3: (0, 1, 2, 3), &#39;two&#39;: [0, 1, 2], &#39;one&#39;: 1}
>>> d[3] = &#39;a tuple&#39;
>>> d
{0: &#39;zero&#39;, 3: &#39;a tuple&#39;, &#39;two&#39;: [0, 1, 2], &#39;one&#39;: 1}

如这个例子所示,可以在一个字典(dictionary)中使用不同数据类型的键和数据值。还可以通过修改字典(dictionary)添加新的类型。最后,产生的 dictionary 的次序并不与插入数据的次序匹配。本质上,字典(dictionary)中元素的次序是由 Python 字典(dictionary)数据类型的实际实现控制的。新的 Python 解释器很容易改变这一次序,所以一定不要依赖于元素在字典(dictionary)中的特定次序。

用字典(dictionary)进行编程

作为正式的 Python 数据类型,字典(dictionary)支持其他较简单数据类型所支持的大多数操作。这些操作包括一般的关系操作符,比如 f539a70d3ea090bac4faa80192f58ccc 和 ==,如清单 7 所示。

清单 7. 一般关系操作符

>>> d1 = {0: &#39;zero&#39;}
>>> d2 = {&#39;zero&#39;:0}
>>> d1 < d2
>>> d2 = d1
>>> d1 < d2
>>> d1 == d2
>>> id(d1)
>>> id(d2)
>>> d2 = d1.copy()
>>> d1 == d2
>>> id(d1)
>>> id(d2)

前面的示例创建两个字典(dictionary)并使用它们测试 < 关系操作符。尽管很少以这种方式比较两个字典(dictionary);但是如果需要,可以这样做。

然后,这个示例将赋值给变量 d1 的字典(dictionary)赋值给另一个变量 d2。注意,内置的 id() 方法对于 d1 和 d2 返回相同的标识符值,这说明这不是复制操作。要想复制字典(dictionary) ,可以使用 copy() 方法。从这个示例中的最后几行可以看出,副本与原来的字典(dictionary)完全相同,但是容纳这字典(dictionary)的变量具有不同的标识符。

在 Python 程序中使用字典(dictionary)时,很可能希望检查字典(dictionary)中是否包含特定的键或值。如清单 8 所示,这些检查很容易执行。

清单 8. 条件测试和字典(dictionary)

>>> d = {0: &#39;zero&#39;, 3: &#39;a tuple&#39;, &#39;two&#39;: [0, 1, 2], &#39;one&#39;: 1}
>>> d.keys()
[0, 3, &#39;two&#39;, &#39;one&#39;]
>>> if 0 in d.keys():
...   print &#39;True&#39;
... 
>>> if &#39;one&#39; in d:
...   print &#39;True&#39;
... 
>>> if &#39;four&#39; in d:
...   print &#39;Dictionary contains four&#39;
... elif &#39;two&#39; in d:
...   print &#39;Dictionary contains two&#39;
... contains two

测试字典(dictionary)中键或数据值的成员关系是很简单的。dictionary 容器数据类型提供几个内置方法,包括 keys() 方法和 values() 方法(这里没有演示)。这些方法返回一个列表,其中分别包含进行调用的字典(dictionary)中的键或数据值。

因此,要判断某个值是否是字典(dictionary)中的键,应该使用 in 操作符检查这个值是否在调用 keys() 方法所返回的键值列表中。可以使用相似的操作检查某个值是否在调用 values() 方法所返回的数据值列表中。但是,可以使用字典(dictionary)名作为简写表示法。这是有意义的,因为一般希望知道某个数据值(而不是键值)是否在字典(dictionary)中。

在 “Discover Python, Part 6” 中,您看到了使用 for 循环遍历容器中的元素是多么容易。同样的技术也适用于 Python 字典(dictionary),如清单 9 所示。

清单 9. 迭代和字典(dictionary)

>>> d = {0: &#39;zero&#39;, 3: &#39;a tuple&#39;, &#39;two&#39;: [0, 1, 2], &#39;one&#39;: 1}
>>> for k in d.iterkeys():
...   print d[k]
... tuple
[0, 1, 2]
>>> for v in d.itervalues():
...   print v
... tuple
[0, 1, 2]
>>> for k, v in d.iteritems():
...   print &#39;d[&#39;,k,&#39;] = &#39;,v
... [ 0 ] = zero[ 3 ] = a tuple[ two ] = [0, 1, 2][ one ] = 1

这个示例演示了遍历字典(dictionary)的三种方式:使用从 iterkeys()、itervalues() 或 iteritems() 方法返回的 Python 迭代器。(顺便说一下,可以通过在字典(dictionary)上直接调用适当方法,比如 d.iterkeys(),从而检查这些方法是否返回一个迭代器而不是容器数据类型。)iterkeys() 方法允许遍历字典(dictionary)的键,而 itervalues() 方法允许遍历字典(dictionary)包含的数据值。另一方面,iteritems() 方法允许同时遍历键到数据值的映射。

字典(dictionary):另一种强大的 Python 容器

本文讨论了 Python 字典(dictionary)数据类型。字典(dictionary)是一种异构的、易变的容器,依赖键到数据值的映射(而不是特定的数字次序)来访问容器中的元素。访问、添加和删除字典(dictionary)中的元素都很简单,而且字典(dictionary)很容易用于复合语句,比如 if 语句或 for 循环。可以在字典(dictionary)中存储所有不同类型的数据,可以按照名称或其他复合键值(比如 tuple)访问这些数据,所以 Python 字典(dictionary)使开发人员能够编写简洁而又强大的编程语句。

위 내용은 Python의 사전 컨테이너에 대한 심층적인 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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