Python集合

Python版本:3.7.0

集合的创建与删除

   直接将集合赋值给变量即可创建一个集合对象。

>>> a={3,5}
>>> a.add(7)
>>> a
{3, 5, 7}

  也可以使用set()函数将列表、元组等其他可迭代对象转换为集合,如果原来的数据中存在重复元素,则在转换为集合的时候只保留一个。

>>> a_set=set(range(8,14))
>>> a_set
{8, 9, 10, 11, 12, 13}
>>> b_set=set([0,1,2,3,0,1,2,3,7,8])
>>> b_set
{0, 1, 2, 3, 7, 8}
>>> x=set()		#空集合
>>> x
set()

add()增加元素
pop()弹出并删除其中第一个元素,不接收参数
remove()直接删除指定元素
clear()清空结合删除所有元素

集合操作

>>> a_set=set([8,8,10,11,12,13])
>>> a_set=set([8,9,10,11,12,13])
>>> b_set=set([0,1,2,3,7,8])
>>> a_set | b_set						#并集
{0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13}
>>> a_set.union(b_set)					#并集
{0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13}
>>> a_set & b_set						#交集
{8}
>>> a_set.intersection(b_set)			#交集
{8}
>>> a_set.difference(b_set)				#差集
{9, 10, 11, 12, 13}
>>> a_set - b_set						#差集
{9, 10, 11, 12, 13}
>>> a_set.symmetric_difference(b_set)	#对称差
{0, 1, 2, 3, 7, 9, 10, 11, 12, 13}
>>> a_set ^ b_set
{0, 1, 2, 3, 7, 9, 10, 11, 12, 13}
>>> x={1,2,3}
>>> y={1,2,5}
>>> z={1,2,3,4}
>>> x<y									#比较集合大小
False
>>> x<z
True
>>> y<z
False
>>> x.issubset(y)						#测试是否为子集
False
>>> x.issubset(z)
True




  作为集合的具体应用,可以使用集合快速提取序列中单一元素,即提取出序列中所有不重复元素,如果使用传统方式,则需要编写下面的代码:

>>> from random import randint
>>> listRandom=[randint(0, 9999) for i in range(100)] #100个介于0~9999之间的随机数

>>> noRepeat=[]
>>> for i in listRandom:
		if i not in noRepeat:
			noRepeat.append(i)

>>> len(listRandom)
>>> len(noRepeat)

  如果使用集合,只需要如下一行代码就可以了。

>>> newSet = set(listRandom)

生成不重复随机数的效率比较

import random
import time

def RandomNumbers(number, start, end):
    '''使用列表来生成numbe个介于start和end之间的不重复随机数'''
    data=[]
    n=0
    while True:
        element=random.randint(start, end)
        if element not in data:
            data.append(element)
            n += 1
        if n==number-1:
            break
    return data

def RandomNumbers1(number, start, end):
    '''使用列表来生成numbe个介于stat和end之间的不重复随机数'''
    data=[]
    while True:
        element=random.randint(start, end)
        if element not in data:
            data.append(element)
        if len(data)==number:
            break
    return data


def RandomNumbers2(number, start, end):
    '''使用集合来生成numbe个介于stat和end之间的不重复随机数'''
    data=set()
    while True:
        data.add(random.randint(start, end))
        if len(data)==number:
            break
    return data

start=time.time()
for i in range(10000):
    RandomNumbers2(50, 1, 100)
print('Time used: ', time.time()-start)
方法用时
RandomNumbersTime used: 1.7229423522949219
RandomNumbers1Time used: 1.7729105949401855
RandomNumbers2Time used: 1.4081363677978516

集合推导式

>>> {x.strip() for x in ('he', 'she ', ' I' )}
{'he', 'I', 'she'}
>>> import random
>>> x={random.randint(1, 500) for i in range(100)} #生成随机数,自动去除重复元素
>>> len(x)										   #一般而言输出结果会小于100

参考文献

[1] 董付国. Python程序设计(第2版)[M]. 清华大学出版社. 2019-08. ISBN 978-7-302-43651-5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值