master
/ 7.1.4 集合关系.ipynb

7.1.4 集合关系.ipynb @masterview markup · raw · history · blame

Notebook

7.4 集合关系

方法 符号 含义
s.issubset(t) s <= t s是否是t的子集,是返回True,否则返回False
检测是否集合中的每个元素都在 t 之中。
s < t s是否是t的真子集,是返回True,否则返回False
s.issuperset(t) s >= t s是否是t的超集,是返回True,否则返回False
检测是否t中的每个元素都在集合之中。
s > t s是否是t的真超集,是返回True,否则返回False
s.isdisjoint(t) s和t是否无共同元素,是返回True,否则返回False
s == t s是否和t相等,是返回True,否则返回False

1. 集合等价/不等价

s == t:
集合 s 是否和集合 t 相等,是返回True,否则返回False。

如果集合s的任何一个元素都是集合t的元素,同时集合t的任何一个元素都是集合s的元素,我们就说集合s等于集合t。

In [1]:
s = set('python')                     #{'t', 'n', 'o', 'h', 'p', 'y'}
t = {'o', 'y', 'p', 'g'}
print(s == t)                         #False
print(s != t)                         #True
False
True

In [4]:
s = set('python')  #{'t', 'n', 'o', 'h', 'p', 'y'}
u = frozenset(s)   #frozenset({'p', 'y', 't', 'n', 'o', 'h'})
print(s == u)      #True
s = set('posh')
t = set('shop')
print(s == t)      # True
True
True

s.isdisjoint(t):
isdisjoint的方法可以判断s和t两个集合有没有相同的元素,如果没有相同元素,该方法返回True,否则该方法返回False

In [5]:
s = set('python')      # {'t', 'n', 'o', 'h', 'p', 'y'}
t = set('java')        # {'j', 'v', 'a'}
u = set('program')     # {'m', 'r', 'g', 'p', 'a', 'o'}

print(s.isdisjoint(t)) # True
print(s.isdisjoint(u)) # False
print(t.isdisjoint(u)) # False
True
False
False
In [6]:
set1 = {'Java', 'Python', 'C++', 'Kotlin'}
set2 = {'Kotlin', 'Swift', 'Java', 'Dart'}
set3 = {'HTML', 'CSS', 'JavaScript'}

print(set1.isdisjoint(set2))  # False
print(set1.isdisjoint(set3))  # True
False
True

参数t可以接受任何可迭代对象,如字符串、列表、元组等。

In [9]:
s = set('python')                         # {'t', 'n', 'o', 'h', 'p', 'y'}
print(s.isdisjoint(['j', 'a', 'v', 'a'])) # 列表做参数,True
print(s.isdisjoint('program'))            # 字符串做参数,False

2. 子集/超集

  • s <= t :集合 s 是否是集合 t 的子集,是返回True,否则返回False。
  • s < t : 集合 s 是否是集合 t 的真子集,是返回True,否则返回False。
  • s >= t :集合 s 是否是集合 t 的超集,是返回True,否则返回False
  • s > t : 集合 s 是否是集合 t 的真超集,是返回True,否则返回False

对于两个集合s与t,如果集合s中任意一个元素都是集合t的元素,那么集合s叫做集合t的子集,集合t叫做集合s的超集。

对于两个集合s与t,如果s是t的子集,且t中至少有一个元素不属于s,那么集合s叫做集合t的真子集,集合t叫做集合s的真超集。

In [13]:
s = set('shop')         # {'h', 's', 'o', 'p'} 
t = set('posh')         # {'o', 'p', 's', 'h'}
u = set('bookshop')     # {'o', 'k', 'h', 's', 'b', 'p'}
print(s < t)            # s 不是 t 的真子集 ,False
print(u > s)            # u 是 s 的真超集,True
print(s <= t)           # s 是 t 的子集 ,True
print(s >= t)           # s 是 t 的超集 ,True
  • s.issubset(t):等价于s <= t
  • s.issuperset(t):等价于s >= t

参数t可以接受任何可迭代对象,如字符串、列表、元组等。

In [19]:
s = set('shop')                 # {'h', 's', 'o', 'p'} 
t = set('posh')                 # {'o', 'p', 's', 'h'}
print(s.issuperset(t))          # True
print(s.issubset('bookshop'))   # True
print(t.issuperset('bookshop')) # False

实例1:二进制IP 地址转十进制

一个IP地址是由四个字节(每个字节8个位)的二进制数组成。请将32位二进制数表示的IP地址转换为十进制格式表示的IP地址输出。十进制格式的IP地址由用“.”分隔开4个十进制数组成(点分十进制表示法)。如果输入的数字不足32位或超过32位或输入的数字中有非0和1的数字时输出“data error!”

分析
输入的字符串未必符合法,可能位数不是32,也可能包含其他字符,这里可以利用集合关系方便的判定输入中是否包括非'0'、'1' 的字符。
合法ip字符串 set(ip) 的结果只能是 {'0'}、 {'1'}、 {'0','1'}中的一个,且字符串长度应等于32。

输入输出示例:

输入 输出
00001010111100000000111110101010 10.240.15.170
11000000101010000000000011 data error!
11000000201010000000000000000004 data error!
In [22]:
def check_ip(ip_bin):
    """接受由二进制数表示IP的字符串,判定是否为合法IP,
    当其合法时返回其对应的十进制IP,否则返回'data error!'
    """
    if len(ip_bin) == 32 and set(ip_bin) <= {'0', '1'}:
        ls = []
        for i in range(4):
            ls.append(str(int(ip_bin[i * 8:(i + 1) * 8], 2)))
        ip_dec = '.'.join(ls)
        return ip_dec         # 输入合法时返回其对应的十进制IP
    else:
        return 'data error!'  # 输入不合法时返回'data error!'


if __name__ == '__main__':
    IP = input()              # 输入二进制的IP地址字符串
    print(check_ip(IP))       # 调用函数判定并完成IP转换