컬렉션은 dict, list, set, tuple과 같은 Python의 일반적인 내장 컨테이너를 대체할 수 있는 특수 컨테이너 데이터 유형(Container Datatype)입니다. 컨테이너는 다양한 개체를 저장하는 데 사용할 수 있는 특수 목적 개체입니다. 이는 포함된 객체에 액세스하고 이를 반복하는 방법을 제공합니다.
Python은 컨테이너 데이터 유형을 구현하는 컬렉션 모듈을 제공합니다. 이 장 시리즈에서는 다음을 포함하는 컬렉션 모듈의 다양한 컬렉션 유형에 대해 알아봅니다.
아래의 간단한 예를 보세요. 코드 목록은 다음과 같습니다.
프로그램 실행의 출력 결과는 다음과 같습니다.
ChainMap({'one': 1, 'two': 2}, {'a': 'A', 'b': 'B'}) [{'one': 1, 'two': 2}, {'a': 'A', 'b': 'B'}]
위 목록에서는 두 개의 사전을 사용하여 ChainMap 개체( 체인_맵). 그런 다음 ChainMap 객체와 지도 속성을 인쇄합니다. 출력에서 볼 수 있듯이 결과는 이러한 사전의 구성 보기입니다.
ChainMap 키 값에 액세스
key() 및 value() 메서드를 사용하여 ChainMap 키와 값에 액세스할 수 있습니다. 코드 예시는 다음과 같습니다.
위 코드의 출력 결과는 다음과 같습니다.KeysView(ChainMap({'one': 1, 'two': 2}, {'a': 'A', 'b': 'B'})) ValuesView(ChainMap({'one': 1, 'two': 2}, {'a': 'A', 'b': 'B'}))프로그램 출력 결과에서 볼 수 있듯이 chain_map.keys()의 결과는 KeysView(키 뷰)이고, chain_map.values()의 결과는 ValuesView(값 보기)입니다. 이 두 가지 뷰 유형 내장 클래스는 각각 해당 키 이름과 값 객체를 순회할 수 있는 반복 가능한 객체입니다. 예: 출력 결과는 다음과 같습니다.
key = a,value=A key = b,value=B key = one,value=1 key = two,value=2 链映射包含的值为: A;B;1;2;코드와 출력 결과를 결합하면 이해하기 쉽습니다. 즉, 체인 매핑은 여러 매핑을 패키지하는 것입니다(맵에는 많은 구현이 있고 사전은 하나입니다). 중)을 하나의 매핑, 즉 체인 매핑으로 변환하여 사전처럼 액세스할 수 있습니다. 예를 들어, 사전과 같은 특정 키 값에 액세스합니다:
print(chain_map['b'] )
ChainMap에는 원하는 수의 사전이 포함될 수 있습니다. 내장된 new_child() 메소드를 사용하여 ChainMap에 새 사전을 추가합니다. new_child() 메서드는 새 매핑과 그 뒤에 현재 인스턴스의 모든 매핑이 포함된 새 ChainMap을 반환합니다. 여기서 주목해야 할 점은 새로 추가된 사전이 ChainMap의 시작 부분에 배치된다는 것입니다. 예를 살펴보겠습니다.
프로그램을 실행하면 입력 결과는 다음과 같습니다.Old: ChainMap({'one': 1, 'two': 2}, {'a': 'A', 'b': 'B'}) New: ChainMap({'x': 0, 'y': 1}, {'one': 1, 'two': 2}, {'a': 'A', 'b': 'B'})
这里需要注意的是,用链式映射的new_child()方法添加新字典后,不改变原来的链映射,会返回一个新的ChainMap对象。另外,如果你修改链式映射所包含的映射或字典,变化也将体现在链式映射对象中。
另外,实践中要当心:如果你按照字典操作来添加新的键值对,则该键值对会添加到链式映射所包含的第一个映射中,如:new_chain_map['X'] = 'Unkown' 。自己动手试试看。
所含映射有相同键怎么办?
底层上,链式映射主要是为把多个字典或映射打包成一个映射,以便集中操作。如果所办函的字典中有相同的键会怎样呢?来看示例:
运行程序输出结果如下:
ChainMap({'id': 21001, 'country': '大秦', 'emperor': '嬴政'}, {'name': '李靖', 'country': '大唐', 'title': '元帅'}) 大秦 ('name', '李靖') ('country', '大秦') ('title', '元帅') ('id', 21001) ('emperor', '嬴政')
很显然,链接的映射中出现相同字典项时,只读取第一个,以第一个为准,而且当你更新一个键的值时,它也只是更新第一个映射内容的键值。
如果你想一次更新所有映射中的相同键的值怎么办呢?你可以自定义一个ChainMap子类来实现,或定义更新方法。因为ChainMap中有个属性maps持有完整的各个映射,可以基于此属性来完成相同键的一次性更新。这里简单给个通过方法的方式实现多映射相同键的一次更新。示例代码如下:
当然,你可以写得更复杂一点,以完成更多的需要,也可实现一次多个映射中的相同键的值。自己动手试试吧。
本文主要介绍了Python集合模块中的链式映射容器——ChainMap的使用,可以把多个字典打包成一个对象来操作。同时需要注意的是,该映射只是对原字典的引用,当你修改原字典时,相应的变化也为体现在链式映射中。同时,在为ChainMap新增新的键值对时,它会添加到所包含的第一个映射对象中。
위 내용은 Python 프로그래밍: 사전 체인 매핑(ChainMap)을 사용하는 또 다른 방법, 플레이해 보세요!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!