首页 > 编程语言 >Python-集合

Python-集合

时间:2024-03-04 17:33:05浏览次数:23  
标签:set 迭代 Python 运算符 对象 add 集合

集合

python中的集合(set)由一些唯一的、不可变的对象组成的无序集合体,集合支持与数学集合中相对应的操作,一个元素在集合中只能出现一次,无论它被添加了多少次。

集合是可迭代对象(iterable),可以按需增长或缩短,并且可以包含多种对象类型,集合很像一个有键无值的字典,但由于集合是无序的,因此集合既不是序列(sequence)也不是映射类型(mapping)。

1. 创建集合对象

要创建一个集合对象,可以向内置的set函数传入一个序列或者其他可迭代对象:

>>> x = set('abcde')
>>> y = set('bdxyz')
>>> x
{'a', 'd', 'e', 'b', 'c'}
>>> y
{'d', 'b', 'z', 'x', 'y'}

python3开始引入了新的集合字面量,可以使用集合字面量的形式(花括号)来创建一个集合对象:

>>> set([1, 2, 3, 4])
{1, 2, 3, 4}
>>> {1, 2, 3, 4}
{1, 2, 3, 4}
>>> type({1, 2, 3, 4})
<class 'set'>

但创建空的集合对象还是需要使用set函数:

>>> type({})  # {}表示是空字典,等同于dict()
<class 'dict'>
>>> type({1})
<class 'set'>
>>> set()  # set()才表示是空集合
set()

2. 集合运算符

集合通过表达式运算符可以支持常用的集合的数学运算:

>>> x - y  # 差集
{'e', 'a', 'c'}
>>> x | y  # 并集
{'a', 'y', 'd', 'e', 'b', 'z', 'x', 'c'}
>>> x & y  # 交集
{'b', 'd'}
>>> x > y, x < y  # 超集判断、子集判断
(False, False)

集合支持成员运算符,可使用成员运算符in进行成员测试:

>>> 'e' in x
True

3. 集合操作

除了运算符,集合对象还定义了与这些运算符操作相对应的方法:

>>> x.difference(y)      # 差集,相当于x - y
{'a', 'e', 'c'}
>>> x.union(y)           # 并集,相当于x | y
{'d', 'x', 'a', 'y', 'b', 'c', 'e', 'z'}
>>> x.intersection(y)    # 交集,相当于x & y
{'b', 'd'}
>>> x.issuperset(y)      # 超集判断,相当于x > y
False
>>> x.issubset(y)        # 子集判断,相当于x < y
False

集合的修改操作:

  • add:添加一个元素到集合中
  • update:添加多个元素到原集合中,相当于在原集合的基础上求并集
  • remove:移除集合中的一个指定元素
  • clear:清空集合
>>> z = set('bd')
>>> z
{'b', 'd'}
>>> z.add('SPAM')
>>> z
{'b', 'SPAM', 'd'}
>>> z.update(set(['x', 'y']))
>>> z
{'b', 'SPAM', 'd', 'x', 'y'}
>>> z.remove('b')
>>> z
{'SPAM', 'd', 'x', 'y'}
>>> z.clear()
>>> z
set()

4. 集合是可迭代对象

集合是可迭代的容器,因此集合可以用于len、for循环和列表推导的操作中,但集合并不是序列因此不支持索引和分片操作。

>>> len(set('abc'))
3
>>> for item in set('abc'):
...     print(item * 3)
...
bbb
ccc
aaa

5. 集合的不可变性

集合中只能包含不可变的(hashable)对象类型,因此列表和字典不能作为元素被嵌入到集合中,而元组则可以嵌入集合中。

>>> s = {0}
>>> s.add([1, 2, 3])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> s.add({'a': 1})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> s.add((1, 2, 3))
>>> s
{0, (1, 2, 3)}
>>> (1, 2, 3) in s
True

集合本身也是可变的,因此不能把一个集合嵌入到另一个集合中。

>>> s.add({1, 2, 3})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'

如果想要将一个集合嵌入到另一个集合中,可以调用内置函数frozenset,frozenset函数会创建一个不可变的集合,该集合不可修改,并且可以嵌入到其它集合中。

>>> f = frozenset({1, 2, 3})
>>> f
frozenset({1, 2, 3})
>>> s.add(f)
>>> s
{0, (1, 2, 3), frozenset({1, 2, 3})}

6. 集合推导

python3中还引入了集合推导构造。集合推导编写在花括号中,在花括号中指定一个表达式,表达式后跟着for循环来遍历可迭代对象,根据表达式的结果迭代生成集合的元素。

>>> {x for x in 'spam'}
{'p', 's', 'm', 'a'}
# 集合推导中可以使用if语句进行过滤
>>> {x for x in 'spam' if x != 'a'}
{'p', 'm', 's'}
# 集合推导还可以使用多个循环
>>> X = {1, 2, 3}
>>> Y = {4, 5, 6}
>>> {x - y for x in X for y in Y}
{-1, -5, -4, -3, -2}

7. 集合常见用途

  • 由于集合中同一元素只能有一个,因此集合可以用于过滤可迭代对象中的重复项(虽然元素顺序可能会重新排列)——将可迭代对象转换为集合,之后再转换回去。
>>> L = [1, 2, 1, 3, 2, 4, 5]
>>> set(L)
{1, 2, 3, 4, 5}
>>> L = list(set(L))
>>> L
[1, 2, 3, 4, 5]
  • 集合可以用于提取列表、字符串以及其他可迭代对象中的差异——将可迭代对象转换为集合,之后求差集。
# 比较bytes对象类型和bytearray对象类型的属性列表差异
>>> set(dir(bytes)) - set(dir(bytearray))
{'__getnewargs__'}
  • 由于集合是无序的,因此可以借助集合进行顺序无关的相等性测试。
>>> L1, L2 = [1, 3, 5, 2, 4], [2, 5, 3, 4, 1]
>>> L1 == L2
False
>>> set(L1) == set(L2)
True

标签:set,迭代,Python,运算符,对象,add,集合
From: https://www.cnblogs.com/N1rv2na/p/18052228

相关文章

  • python3.6.8 安装解决ssl问题
    https://www.cnblogs.com/mqxs/p/9103031.html#!/bin/bashecho"正在安装相关组件"yuminstall-yopenssl-develbzip2-develexpat-develgdbm-develreadline-develsqlite-develgcc-c++gccopenssl-develecho"下载安装包"wgethttps://www.python.org/ft......
  • python将图片按照指定尺寸比例压缩
            fromPILimportImagedefcompress_image(input_image_path,output_image_path,target_width,target_height):"""压缩图片到指定尺寸。:paraminput_image_path:原始图片的路径:paramoutput_image_path:压缩后图片的保......
  • Python项目 简单计算器的二次开发
    在互联网上找到一个简单计算器的项目源码点击查看代码#计算器#加法defadd(a,b):c=a+bprint(f"结果为:{c:.2f}")#减法defsub(a,b):c=a-bprint(f"结果为:{c:.2f}")#乘法defmul(a,b):c=a*bprint(f"结果为:{c:.2f}......
  • python merge函数使用
    函数语法:pd.merge(left,right,how="inner,on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True)参数解释:left-数据顿对象。right-另一个数据顿对象on-要连接的列(名称)。必须在左侧和右侧数据框对象中找到lefton-左数据框......
  • H3C利用python开socks5
    H3C利用python开socks5#!/usr/bin/envpythonfromSocketServerimportBaseServer,ThreadingTCPServer,StreamRequestHandlerfromsocketimportsocket,AF_INET,SOCK_STREAMimportsignalimportstructimportsysimportthreadimportos'''exec(......
  • python获取服务器基本信息的脚本
     之前我发布了批量收集服务器信息脚本,本次更新优化了脚本,对脚本设置了trycatch抛出异常等等,收集信息如下:ip地址","主机名","序列号","服务器型号","系统盘数量","系统盘符","系统盘容量","系统盘分区","硬盘列表","硬盘数量","CPU核数","CP......
  • 利用python的http.server定制自己的页面和响应
    pythonhttp.server简介pythonhttp.server是一个简单的基础的httpserver,默认查找网站根目录的index.html文件,如果没有index.html文件,则放回网站根目录文件视图这里我们想对http.server进行修改,实现我们特定的需求,如果只变化html确实能展现不能的静态页面,但是没有办法进行交互,如......
  • 总结的Java知识点集合
    这是我读大学时的Java知识点总结,还不全面,后续会逐渐增加完善。知识点集合实例变量实例变量是指在类中声明的变量,其值是针对类的每个实例而独立存储的。每个类的实例都有自己的一组实例变量,它们的值可以在对象创建时初始化,并在整个对象的生命周期中保持不变或者随着对象的状态而......
  • python -- 解决安装pyxll-jupyter时出现“TimeoutError: The read operation timed ou
     在cmd输入命令”pipinstallpyxll-jupyter“进行安装,控制台出现以下报错信息:Downloadingpyxll_jupyter-0.5.2-py3-none-any.whl(46kB)----------------------------------------46.3/46.3kB16.1kB/seta0:00:00Downloadingjupyter-1.0.0-py2.py3-none-any.whl......
  • Python-数值类型
    数值类型1.内置数值工具内置数学函数:pow:计算幂abs:计算绝对值sum:求和round:向上取整(四舍五入)max:求最大值min:求最小值>>>pow(2,4),2**4,2.0**4.0(16,16,16.0)>>>abs(-42.0),sum((1,2,3,4))(42.0,10)>>>min((1,2,3,4)),max((1,2,3,4))......