集合与区间
5169字,阅读需时18分钟

集合是数学中一个很重要的基本概念,是指具有某种特定性质的事物的总体,组成这个集合的事物称为该集合的元素。

例1 下面是一个简化的商品购买数据集T,每条数据t(i)表示一位顾客在超市一次购买商品的集合。

购买数据集T:

t(1):{牛奶、面包、牛肉}

t(2):{牛奶、猪肉}

t(3):{猪肉、火腿}

t(4):{牛奶、面包、火腿}

t(5):{牛奶、面包、衣服、火腿、牛肉}

t(6):{面包、衣服、牛奶}

t(7):{面包、牛奶、衣服}

  对给定的集合来说,它的元素是确定的,任何一个元素要么在集合中,要么不在集合中。例如:集合t(1)的元素为牛奶、面包、牛肉,火腿就不在集合t(1)内,它在集合t(3)、t(4)、t(5)内。

例2 有甲、乙、丙、丁、戊、己7个人,其中甲、乙、丙早饭喝的豆浆、吃的油条,丁早饭喝的豆浆,戊、己早饭喝的八宝粥、吃的肉包,问:

(1)    有多少人早餐喝豆浆?

(2)    早餐的种类有哪些?

(3)    找出甲和丁吃的不同早餐种类

可以用集合的概念来求解上面的问题,定义集合A、B、C、D、E、F,分别表示甲、乙、丙、丁、戊、己吃的早餐种类:

A  =  {豆浆, 油条}

B  =  {豆浆, 油条}

C  =  {豆浆, 油条}

D  =  {豆浆}

E  =  {八宝粥,肉包}

F  =  {八宝粥,肉包}

第1个问题是求喝豆浆的人数,该问题可以使用集合的交集运算,定义集合TEMP={豆浆},将A、B、C、D、E、F集合分别与集合TEMP进行交集运算,若交集运算后的结果不是空集,则计入喝豆浆的人数。

# 定义早餐集合
breakfast_list = [
    {"豆浆","油条"},
    {"豆浆","油条"},
    {"豆浆","油条"},
    {"豆浆"},
    {"八宝粥","肉包"},
    {"八宝粥","肉包"}
]
 
# 计算早餐豆浆函数
def soybean(data):
    # 计数器
    count = 0
    # 临时集合
    temp = {"豆浆"}
    # 遍历列表data
    for item in data:
        # 求两个集合的交集       
        if item & temp:
            # 若交集结果不为空,count加1  
            count = count + 1
    return count
 
# 程序入口
if __name__ == '__main__':
    count = soybean(breakfast_list)
    print("早餐喝豆浆人数:%d" % (count))

第2个问题是求早餐的种类有哪些,该问题可以使用集合的并集运算,对A、B、C、D、E、F集合连续求并集,计算的结果集合为早餐所有的种类。

# 定义早餐集合
breakfast_list = [
    {"豆浆","油条"},
    {"豆浆","油条"},
    {"豆浆","油条"},
    {"豆浆"},
    {"八宝粥","肉包"},
    {"八宝粥","肉包"}
]
 
# 计算早餐所有种类
def all(data):
    # 临时集合
    temp = set()
    # 遍历列表data
    for item in data:
        # 求两个集合的并集       
        temp = item | temp
    return temp
 
# 程序入口
if __name__ == '__main__':
 
    temp = all(breakfast_list)
    print("早餐种类:%s" % (temp))

第3个问题可以求集合A和D的差集,A和D差集内的元素即为甲和丁吃的不同早餐种类。

# 定义早餐集合
breakfast_list = [
    {"豆浆","油条"},
    {"豆浆","油条"},
    {"豆浆","油条"},
    {"豆浆"},
    {"八宝粥","肉包"},
    {"八宝粥","肉包"}
]
 
# 计算两个集合不同的早餐种类
def different(s1,s2):
    # 返回s1和s2的差集
    return s1 - s2
 
# 程序入口
if __name__ == '__main__':
 
    temp = different(breakfast_list[0],breakfast_list[3])
    print("甲和丁吃的不同早餐种类为:%s" % (temp))

 

区间是数学中最重要的数集,区间一般是指实数集合,表示一类实数的范围。设a和b是实数,且a<b,则数集:

{x | a < x < b}

称为开区间,可以记作(a,b),a和b称为开区间(a,b)的端点,a不包含在(a,b)区间内,b也不包含在(a,b)区间内。

若数集:{x | a ≤ x ≤ b}

称为闭区间,记作[a,b],a和b也称为闭区间[a,b]的端点。类似数集:

[ a,b )  =  {x | a≤x <b}

( a,b ]  =  {x | a<x≤ b}

称为半开区间。

使用Python处理区间数据,可以使用interval库,在使用之前需要安装interval库,最简单的安装方法就是在shell窗口运行pip3 install interval命令。

例3  [0,1]闭区间内的操作

# 导入Interval库
from interval import Interval
# 创建[0,1]闭区间
close_interval = Interval(0,1,lower_closed=True, upper_closed=True)
# 判断0.001是否在[0,1]区间内
print(0.001 in close_interval)
# 检验区间[0,1]左侧边界值
print(0 in close_interval)
# 检验区间[0,1]右侧边界值
print(1 in close_interval)

Interval类可以创建开区间、闭区间或半开区间,返回创建的区间对象,区间对象支持Python的in或not in运算符,用于判断一个给定的数值是否在区间内。

创建开区间(0,1):

close_interval = Interval(0,1,lower_closed=False, upper_closed=False)

创建半开区间(0,1]:

close_interval = Interval(0,1,lower_closed=False, upper_closed=True)

创建半开区间[0,1):

close_interval = Interval(0,1,lower_closed=True, upper_closed=False)

Interval类有三种区间的操作方法,分别是join方法,overlaps方法和adjacent_to方法。

join方法是区间合并,将两个区间合并为一个区间,并返回新的区间对象。

例4  区间的合并操作

# 导入Interval库
from interval import Interval
# 创建[0,1]闭区间
interval_one = Interval(0,1,lower_closed=True, upper_closed=True)
# 创建[1,2]闭区间
interval_two = Interval(1,2,lower_closed=True, upper_closed=True)
# 区间合并
interval_merge = interval_one.join(interval_two)
print(interval_merge)

overlaps方法是判断两个区间是否有交集,若有交集则返回True。

例4  判断区间是否有交集

# 导入Interval库
from interval import Interval
# 创建[0,1]闭区间
interval_one = Interval(0,1,lower_closed=True, upper_closed=True)
# 创建[1,2]闭区间
interval_two = Interval(1,2,lower_closed=True, upper_closed=True)
# 判断区间是否有交集
print(interval_one.overlaps(interval_two))

interval_one的区间是[0,1],interval_two的区间是[1,2],两个区间存在交集,交集为数值1。

adjacent_to方法用于判断两个区间是否比邻,两个区间比邻是指即相邻又无交集。

例5  判断两个区间是否比邻

# 导入Interval库
from interval import Interval
# 创建[0,1)闭区间
interval_one = Interval(0,1,lower_closed=True, upper_closed=False)
# 创建[1,2]闭区间
interval_two = Interval(1,2,lower_closed=True, upper_closed=True)
# 判断区间是否比邻
print(interval_one.adjacent_to(interval_two))

区间interval_one是半开区间[0,1),区间interval_one是闭区间[1,2],两个区间没有交集,但这两个区间比邻,因为区间interval_one右侧端点是1,interval_two的左侧端点也是1。

我要评论
全部评论