一、集合类型(Sets)


集合对象是不同的(不可重复)hashable对象的无序集合。常见用法包括:成员关系测试、移除序列中的重复、以及科学计算,例如交集、并集、差分和对称差分。通俗点来说,集合是一个无序不重复元素的数据集,其基本功能是进行成员关系测试和消除重复元素。

目前有两种内置的集合类型:set 和 frozenset。set类型是可变的--可以使用add() 和 remove()等方法更改其内容。由于它是可变的,它没有hash值,因此它不能被当做字典的键值或另一集合的元素。frozenset类型是不可变的 和 hashable的,它的内容不能再创建后改变,因此它可以用作字典的键值或作为另一个集合的元素。

set类构建函数

class set([iterable])
class frozenset([iterable])

set的构建方式

  • 将一个用逗号分割的元素列表放在一堆花括号内可以创建一个非空set集合,如{'Tom', 'Jerry', 'Peter'}
  • 给set的构建函数传递一个空值将会创建一个空set集合(注意:{}表示的是一个空字典而不是空set集合)
  • 给set的构架你函数传一个非空iterable参数将会创建一个非空set集合

注意:

再次强调,一个set集合内的元素必须是hashable的(不可变的)。要想表示一个set的set,那么内部的set必须是frozenset对象,因为frozenset是不可变的,是hashable的。

set构建示例

>>> {'Tom', 'Jerry', 'Peter'}  # 使用花括号创建非空set集合
{'Jerry', 'Tom', 'Peter'}
>>> set() # 使用set构建函数创建空set集合
set()
>>> set((1, 2, 3 ,4)) # 使用set构建函数创建非空set集合
{1, 2, 3, 4}
>>> set((1, 2, 3 ,['a', 'b', 'c'])) # set集合中的元素必须是不可变的、可哈希的
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

set 和 frozenset都支持的操作

作为无序集合,set不记录元素位置或插入顺序。因此set不支持索引、切片或其他类序列行为。

len(set)  # 获取集合中的条目个数
x in set # 成员关系测试--包含
x not in set # 成员关系测试--不包含
for x in set # 循环遍历集合中的条目
isdisjoint(other) # 判断该集合是否与另外一个集合不相交(当且仅当交集为空),不相交则返回True
issubset(other) 或 set <= other # 判断该集合是否是另外一个集合的子集
set < other # 判断该集合是否是另外一个集合的真子集
issuperset(other) 或 set >= other # 判断该集合是否是另外一个集合的父集
set > other # 判断该集合是否是另外一个集合的真父集
union(other,...) 或 set | other | ... # 求该集合与另外一个或多个集合的并集
intersection(other,...) 或 set & other & ... # 求该集合与另外一个或多个集合的交集
difference(other,...) 或 set - other - ... # 求该集合与另外一个或多个集合的差集(该集合中存在但其它集合中不存在的元素集合)
symmetric_difference(other) 或 set ^ other # 求该集合与另外一个集合的对称差集(该集合中存在但另一集合中不存在,或另一集合中存在但该集合中不存在的元素集合)
copy() # 返回一个新的浅拷贝集合

说明:

a) union()、intersection()、differnce()、symmetric_difference()、issubset() 和 issuperset()方法的可接受任何可迭对象作为参数。相比之下,它们的基于运算符的相应操作需要它们的参数是set。这避免了像set('abc') & 'cbs'这样易出错的结构,有利于更易读的结构,如set('abc').intersection('cbs')。

>>> set('abc')
{'c', 'a', 'b'}
>>> set('abc') & 'cbs' # 使用操作符进行相关操作,操作符两边都必须是set类型
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for &: 'set' and 'str'
>>> set('abc') & set('cbs')
{'c', 'b'}
>>> set('abc').intersection('cbs') # 调用方法进行相关操作,参数可以是任意可迭代对象
{'c', 'b'}
>>> set('abc').intersection(['c','s', 'b'])
{'c', 'b'}

b) set和frozenset支持 集合与集合进行比较操作。

  • 当且仅当每个集合的每个元素都包含在另一个(每个集合都是另一个的子集)时,两个集合是相等的;
  • 当且仅当第一集合是第二集合的真子集(是子集,但不相等)时,集合小于另一集合;
  • 当且仅当第一集合是第二集合的真父集(是父集,但不相等)时,集合大于另一集合;

c) set和frozenset之间是基于它们的成员进行比较的。比如set('abc') == frozenset('abc')返回True,因此set('abc') in set([frozenset('abc')])

>>> set('abc') == frozenset('abc')
True
>>> set('abc') in frozenset('abc')
False
>>> set('abc') in set(frozenset('abc'))
False
>>> set('abc') in set([frozenset('abc')])
True

d) 子集和相等的比较不推广到总排序函数。例如,任何两个非空且不相交的集合是不相等的,并且不是彼此的子集。因此,它们对应的以下操作都返回False: a<b, a==b, a>b。

e) 因为set之定义了部分排序(子集关系),因此灭有为set的list定义list.sort()方法。

f) set集合的元素像dict的键一样,必须是可哈希的。

g) set实例与frozenset实例混合进行二进制操作将会返回第一个操作数的类型。例如:frozenset('ab')

| set('bc')会返回一个frozenset实例。

set支持但frozenset不支持的操作

set是可变集合,而frozenset是不可变集合,因此set的有些修改操作是frozenset不支持的。

add(elem)  # 向集合中添加一个元素
remove(elem) # 从集合中删除一个元素,如果集合中不包含该元素会抛出KeyError错误
discard(elem) # 如果集合中包含该元素则删除它,这个方法明显比remove()好用
pop() # 由于set集合是无序的,因此该方法会移除并返回一个随机元素,而不是像list.pop()移除并返回最后一个元素
clear() # 清除set集合中的所有元素
update(other,...) 或 set |= other | ... # 更新set集合,将其它集合中的元素添加进来;简单点来说就是与其它一个或多个集合求并集并将结果赋值给自己
intersection_update(other,...) 或 set &= other & ... # 更新set集合,只保留所有集合中都存在的元素;简单点来说就是与其它一个或多个集合求交集并将结果赋值为自己
difference_update(other,...) 或 set -= other | ... # 与其它一个或多个集合求差集并将结果赋值给自己
symmetric_difference_update(other) 或 set ^= other # 与另外一个集合求对称差集并将结果赋值给自己;对称差集就是A-B 与 B-A 的并集

说明:

上面这些update方法也是可以接受任何可迭代对象作为参数。另外,remove(elem)和discard(elem)等方法中参数elem可以是一个set集合。为了支持搜索等效的frozenset,elem集合会在搜索期间被暂时修改,然后恢复。在搜索期间,elem不应该被读取或改动,因为它没有有意义的值。

二、映射类型(mapping)


一个mapping对象将可哈希的值映射为任意对象。映射是可变对象。目前Python中只有一种标准映射类型,就是字典(dict)。dcit和Set集合一样也是用花括号表示,但是花括号中的每个元素都是一个键值对(key:value)。字典中的键值对也是无序的,且key必须是可哈希的不可变类型,如字符串、数字、布尔值和不包含可变类型的tuple。而list和包含可变类型的tuple是不能做字典的key的。另外,同一个字典中,key不能重复,否则会覆盖之前的值。、

用于键的数字类型遵守数字比较的正常规则:如果两个数字比较相等(比如1和1.0),则它们可以互相使用以索引相同的字典条目。但是需要注意,由于计算机存储浮点数作为近似值,因此使用它们作为字典的键通常是不明智的。

dict类构建函数

class dict(**kwarg)
class dict(mapping, **kwarg)
class dict(iterable, **kwarg)

上面的dict构建函数会返回一个新的字典,这个新的字典是从一个可选的位置参数和一组可能为空关键字参数初始化的。

dict的构建方式

  • 将以逗号分隔的 key:value (键值对)列表放置在一对花括号中:{},{'Tom':1, 'Jerry':2, 'Peter':3}
  • 使用不传递位置参数的构建函数,创建空字典:dict(),等同于{}
  • 如果给定了位置参数,并且它是映射对象,则使用与该映射对象相同的键值对创建字典;否则,位置参数必须是可迭代对象。可迭代对象中的每个条目本身必须是具有两个对象的可迭代对象。每个条目的第一个对象将会成为新字典中的键,第二个对象将会成为对应的值。如果键多次出现,则该键的最后一个值将成为新字典中的相应值。
  • 如果给出了关键字参数,则将关键字参数及其值添加到从位置参数创建的字典中。如果要添加的键已经存在,则来自关键字参数的值将替换位置参数中的值。

dict构建示例

空字典

>>> a = {}
>>> a
{}
>>> b = dict()
>>> b
{}
>>> a == b
True

非空字典

>>> a = {'one': 1, 'two': 2, 'three': 3}  # 将以逗号分隔的键值对列表放置在一对花括号中
>>> b = dict(one=1, two=2, three=3) # 使用dict构建函数,并传递关键字参数
>>> c = dict([('two', 2), ('one', 1), ('three', 3)]) # 使用dict构建函数,并传递可迭代对象为位置参数
>>> d = dict({'three': 3, 'two': 2, 'one': 1}) # 使用dict构建函数,并传递可迭代对象作为位置参数
>>> e = dict({'three': 3, 'two': 2, 'one': 1}, four=4, five=5) # 使用dict构建函数,同时传递可迭代位置参数和关键字参数
>>> e
{'five': 5, 'two': 2, 'three': 3, 'one': 1, 'four': 4}
>>> a == b == c == d
True

关于[('one', 1), ('two', 2), ('three', 3)]这种格式的列表我们可以通过zip类来创建(zip在Python 2.x中是一个内建函数,而在Python 3.x中是一个类),zip类的构建函数如下:

zip(iter1 [,iter2 [...]])

为了方便查看效果,我们使用Python 2.x来做下实验:

>>> zip(['one', 'two', 'three'], [1, 2, 3])
[('one', 1), ('two', 2), ('three', 3)]
>>> zip(['one', 'two', 'three'], [1, 2, 3], ('I', 'II', 'III'))
[('one', 1, 'I'), ('two', 2, 'II'), ('three', 3, 'III')]
>>> zip(['one', 'two', 'three', 'four'], [1, 2, 3, 4], ('I', 'II', 'III')) # 结果中的条目数与此处条目数最少的可迭代对象一致
[('one', 1, 'I'), ('two', 2, 'II'), ('three', 3, 'III')]

dict支持的操作

len(d)  # 返回字典d中的条目数
key in d # 如果字典d中包含key这个键则返回True, 否则返回False
key not in d # 与上面刚好相反 d[key] # 返回key对应的条目的值,如果key不存在会抛出KeyError异常
get(key[, default]) # 如果key存在则返回其对应的值,否则返回default参数指定的值。如果default没有被指定,则default取None,因此该方法永远不会抛出KeyError异常。
setdefault(key[,default]) # 如果key存在则返回这个key对应的值,如果key不存在则插入一个键值对key:default并返回default的值。default默认值为None。
classmethod fromkeys(seq[,value]) # 这是个类方法,用于创建一个新的字典。seq序列中的元素将作为新字典中的key,而value将会是这些key共同的值,value默认为None。 copy() # 返回该dict的一个浅拷贝 keys() # 返回一个字典键的新视图
values() # 返回一个字典值的新视图
items() # 返回一个字典条目的新视图:(key, value)
iter(d) # 返回字典键的一个迭代器,这是iter(d.keys())的简写方式 d[key] = value # 如果key不存在则表示新增一个条目,如果key已经存在则表示修改该条目的值
update([other]) # 用other中的键值对更新字典的内容,覆盖现有的key。other可以是一个字典对象或键/值对(比如长度为2的元组或其它可迭代对象)。如果指定了关键字参数,字典将会使用关键字参数对字典的键/值对更新,如:d.update(红色=1, 蓝色=2) del d[key] # 删除key对应的表木,如果key不存在会抛出KeyError异常
popitem() # 从字典中删除并返回一个任意(key, value)对,如果字典为空会抛出KeyError异常。该方法对于破坏性的遍历字典很有用,常用于集合算法。
pop(key[,default]) # 如果key存在就删除它并返回它的值,否则返回default的值。如果default没有被给出并且key不存在,则抛出KeyError异常。
clear() # 清空dict中的所有条目

操作示例

>>> d = {'one': 1, 'two': 2, 'three': 3}
>>> len(d)
3
>>> 'two' in d
True
>>> 'two' not in d
False
>>>
>>> d['three']
3
>>> d['four']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'four'
>>> d.get('three')
3
>>> d.get('four', 'default')
'default'
>>> d
{'one': 1, 'two': 2, 'three': 3}
>>> d.setdefault('three', 'default')
3
>>> d
{'one': 1, 'two': 2, 'three': 3}
>>> d.setdefault('four', 'default')
'default'
>>> d
{'one': 1, 'two': 2, 'four': 'default', 'three': 3}
>>> dict.fromkeys(['one', 'two', 'three'])
{'one': None, 'two': None, 'three': None}
>>> dict.fromkeys(['one', 'two', 'three'], 'default')
{'one': 'default', 'two': 'default', 'three': 'default'}
>>>
>>> d.copy()
{'one': 1, 'two': 2, 'four': 'default', 'three': 3}
>>> d['four'] = 4
>>> d
{'one': 1, 'two': 2, 'four': 4, 'three': 3}
>>> d['five'] = 5
>>> d
{'one': 1, 'two': 2, 'five': 5, 'four': 4, 'three': 3}
>>> d.update({'two': 'II', 'six': 6})
>>> d
{'one': 1, 'two': 'II', 'four': 4, 'five': 5, 'six': 6, 'three': 3}
>>> d.update(two=2, seven=7)
>>> d
{'one': 1, 'two': 2, 'four': 4, 'five': 5, 'six': 6, 'seven': 7, 'three': 3}
>>> d.update([('three', 'III'), ('eight', 8)])
>>> d
{'one': 1, 'two': 2, 'four': 4, 'five': 5, 'eight': 8, 'six': 6, 'seven': 7, 'three': 'III'}
>>>
>>> d.keys()
dict_keys(['one', 'two', 'four', 'five', 'eight', 'six', 'seven', 'three'])
>>> d.values()
dict_values([1, 2, 4, 5, 8, 6, 7, 'III'])
>>> d.items()
dict_items([('one', 1), ('two', 2), ('four', 4), ('five', 5), ('eight', 8), ('six', 6), ('seven', 7), ('three', 'III')])
>>> iter(d)
<dict_keyiterator object at 0x000001EA21A179A8>
>>> iter(d.keys())
<dict_keyiterator object at 0x000001EA21A175E8>
>>>
>>> del d['eight']
>>> d
{'one': 1, 'two': 2, 'four': 4, 'five': 5, 'six': 6, 'seven': 7, 'three': 'III'}
>>> d.popitem()
('one', 1)
>>> d
{'two': 2, 'four': 4, 'five': 5, 'six': 6, 'seven': 7, 'three': 'III'}
>>> d.pop('three')
'III'
>>> d
{'two': 2, 'four': 4, 'five': 5, 'six': 6, 'seven': 7}
>>> d.pop('three')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'three'
>>> d.pop('three',None)
>>> d.pop('three','default')
'default'
>>> d.clear()
>>> d.popitem()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'popitem(): dictionary is empty'

字典视图对象(Dictionary view objects)

对于dict.keys()、dict.values()和dict.items()这些函数,在Python 2.x中返回的是list对象,而在Python 3.x中返回的是一个叫做字典视图的对象。

python 2.x

>>> d = {'one': 1, 'two': 2, 'three': 3}
>>> d.keys()
['three', 'two', 'one']
>>> d.values()
[3, 2, 1]
>>> d.items()
[('three', 3), ('two', 2), ('one', 1)]

python 3.x

>>> d = {'one': 1, 'two': 2, 'three': 3}
>>> dkeys = d.keys()
>>> dkeys
dict_keys(['one', 'three', 'two'])
>>> dvalues = d.values()
>>> dvalues
dict_values([1, 3, 2])
>>> ditems = d.items()
>>> ditems
dict_items([('one', 1), ('three', 3), ('two', 2)])

字典视图在字典条目上提供了一个动态视图,这意味着当字典发生变化时,相应的视图也会发生变化。要保存固定的值需要将字典视图强制转换为其他类型的对象进行保存,通常保存为list类型。

>>> d['four'] = 4
>>> d
{'one': 1, 'three': 3, 'two': 2, 'four': 4}
>>> dkeys
dict_keys(['one', 'three', 'two', 'four'])
>>> dvalues
dict_values([1, 3, 2, 4])
>>> ditems
dict_items([('one', 1), ('three', 3), ('two', 2), ('four', 4)])

Python数据类型之“集合(Sets)与映射(Mapping)”的更多相关文章

  1. 【转】Python数据类型之“集合(Sets)与映射(Mapping)”

    [转]Python数据类型之“集合(Sets)与映射(Mapping)” 一.集合类型(Sets) 集合对象是不同的(不可重复)hashable对象的无序集合.常见用法包括:成员关系测试.移除序列中的 ...

  2. Python笔记_第一篇_面向过程_第一部分_5.Python数据类型之集合类型(set)

    集合!Python中的集合数据基本上是为了方便数学计算使用的. 什么是集合? 集合就是“确定的一堆东西”.集合里面的东西叫做元素. 特点:1. 集合里面是没有重复的元素的.           2. ...

  3. 7、python数据类型之集合set

    数据类型之集合setset 不允许重复的无序集合,不能通过下标取值,因为无序1.创建   创建空集合   s ={} 默认类型为字典,所以不是空集合,空集合如下   s = set()   s = { ...

  4. python 数据类型之集合

    一.集合的定义: 定义:由不同元素组成的集合,集合中是一组无序排列的可hash值,可以作为字典的key. 特性:集合的目的是将不同的值存放到一起,不同的集合间用来做关系运算,无需纠结于集合中单个值 二 ...

  5. Python数据类型-8 集合set

    集合set set集合是一个无序不重复元素的集,基本功能包括关系测试和消除重复元素.集合使用大括号({})框定元素,并以逗号进行分隔.但是注意:如果要创建一个空集合,必须用 set() 而不是 {} ...

  6. Python—数据类型之集合(Set)

    1.集合是一个无序的,且不重复元素的集合.它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的. 2.基本功能包括关系测试和消除重复元素.注意:集合存在的意义就是去 ...

  7. Python基础-python数据类型之集合(四)

    集合 集合是一个无序的,不重复的数据组合,基本功能包括关系测试和消除重复元素. 集合对象还支持 union,intersection,difference和 sysmmetric difference ...

  8. 8-Python3从入门到实战—基础之数据类型(集合-Sets)

    Python从入门到实战系列--目录 集合的定义 集合(set)和字典类似,也是一组key的集合,但不存储value:由于key不能重复,所以,在set中,没有重复的key. 创建一个set,需要提供 ...

  9. python 数据类型 之 集合

    集合是一个数学概念:由一个或多个确定的元素所构成的整体叫做集合 集合的三个特性: 1.确定性 (element必须可hash,不可变类型是可hash的) 2.互异性(集合中element 不能重复) ...

随机推荐

  1. VS2012中,C# 配置文件读取 + C#多个工程共享共有变量 + 整理using语句

    (一) C# 配置文件读取 C#工程可以自动生成配置文件,以便整个工程可以使用设置的配置进行后续的处理工作. 1. 首先,右键工程文件-->Properties -->settings-- ...

  2. [转]c++中vector的使用

    C++中的vector使用范例 一.概述 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector是一个容器,它能够存放各种类型的对象,简 ...

  3. android studio导入jar的两种方式

    一.第一种是打开工程所在Project Structure,然后选择Dependencies,点击那个加号选择File Dependency ,然后再Libs文件夹中选择要导入的jar包 1. 2. ...

  4. redmine中创建项目与跟踪标签(原创)

    今天来说下本公司所用到的项目管理工具redmine,总体来说还是比较好用的.redmine中可以记录项目的整个过程,可创建跟踪标签(里程碑.需求用例.功能.任务.缺陷)来进行对项目的管控.跟踪标签根据 ...

  5. samba server install

    要求: create vnc service for win7 access it via vnc viewer. 1TB disk for this Centos PC is used as Sam ...

  6. sql常见的面试题

    1.用一条SQL语句 查询出每门课都大于80分的学生姓名 name   kecheng   fenshu 张三     语文       81张三     数学       75李四     语文   ...

  7. Silverlight用户自定义控件件中增加属性和方法

    下面的例子在用户控件MyCpmzSelect中增加了一个myCaption属性 public static readonly DependencyProperty myCaptionProperty ...

  8. svn忽略eclipse自动生成的文件

    工程目录下右键,选择“TortoiseSVN”——“Settings”菜单 选择“General”,在“Global ignore pattern”输入框的最前面添加 .settings .class ...

  9. 大数据存储:MongoDB实战指南——常见问题解答

    锁粒度与并发性能怎么样? 数据库的读写并发性能与锁的粒度息息相关,不管是读操作还是写操作开始运行时,都会请求相应的锁资源,如果请求不到,操作就会被阻塞.读操作请求的是读锁,能够与其它读操作共享,但是当 ...

  10. Unity3d热更新全书-加载(一)从AssetBundle说起

    Unity3D动态下载资源,有没有解?有,AssetBundle就是通用解,任何一本书都会花大幅篇章来介绍AssetBundle. 我们也来说说AssetBundle 我们试全面的分析一下Unity3 ...