Python--set笔记以及 练习

__author__ = 'miaoge'

'''
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),
但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:
  去重,把一个列表变成集合,就自动去重了
关系测试,测试两组数据之前的交集、差集、并集等关系。
集合(set)是一个无序的不重复元素序列。
可以使用大括号 { } 或者 set() 函数创建集合,
注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
'''


# 1 创建一个空的集合
se = set()

# 2 直接创建(集合的元素是不可变的,集合不能作为字典的K)
# se = {'nihao',999,[1,2,3]}
se = {'nihao',999,(1,2,3),True,9.8}

set1 = set({1,2,'barry'})
set2 = {1,2,'barry'}
print(set1,set2) # {1, 2, 'barry'} {1, 2, 'barry'}

# 3 列表的推导式
set3 = {i*2 for i in range(9)}


# 增
se = {1,2,3,4}
se.add(5) #追加5 如果5存在就不追加
print(se)

#update:迭代着增加
se.update('A')
print(se)
se.update([1,2,3])
print(se)



#删
set1 = {'alex','wusir','ritian','egon','barry'}
# set1.remove('alex') # 删除一个元素
# print(set1)

set1.pop() # 随机删除一个元素
print(set1)

# set1.clear() # 清空集合
# print(set1)

# del set1 # 删除集合
# print(set1)


#4.1 交集。(& 或者 intersection)
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 & set2) # {4, 5}
print(set1.intersection(set2)) # {4, 5}

# 4.2 并集。(| 或者 union)
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 | set2) # {1, 2, 3, 4, 5, 6, 7,8}
print(set2.union(set1)) # {1, 2, 3, 4, 5, 6, 7,8}


# 差集。(- 或者 difference)
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 - set2) # {1, 2, 3}
print(set1.difference(set2)) # {1, 2, 3}


# 4反交集。 (^ 或者 symmetric_difference)
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 ^ set2) # {1, 2, 3, 6, 7, 8}
print(set1.symmetric_difference(set2)) # {1, 2, 3, 6, 7, 8}

# 5子集与超集
set1 = {1,2,3}
set2 = {1,2,3,4,5,6}

print(set1 < set2)
print(set1.issubset(set2)) # 这两个相同,都是说明set1是set2子集。

print(set2 > set1)
print(set2.issuperset(set1)) # 这两个相同,都是说明set2是set1超集。

# frozenset不可变集合,让集合变成不可变类型。
s = frozenset('barry')
print(s,type(s)) # frozenset({'a', 'y', 'b', 'r'}) <class 'frozenset'>






# 1:构建一个列表(使用列表推导式,和list(iterable)和列表相加的方式完成

l = [ i for i in range(1,10) ] + list('jqka')
print(l)

# 2:使用列表推导式完成找
# 找到嵌套列表中名字含有两个‘e’的所有名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
l = [j for i in names for j in i if j.count('e') == 2]
print(l,'----')

# name = []
# for n in names:
# for x in n:
# if x.count('e') == 2:
# name.append(x)
#
# print(name)

# 3:将一个字典的key和value对调
mcase = {'a': 10, 'b': 34}
#1
new_macase = {value:key for key,value in mcase.items()}
#2
# i = dict(zip(mcase.values(),mcase.keys()))
# print(i)

print(new_macase)



# 4:合并大小写对应的value值,将k统一成小写
mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
print({x.lower():mcase.get(x.lower(),0)+mcase.get(x.upper(),0) for x in mcase.keys()})


# 5 :集合推导式

squared = {x**2 for x in [1, -1, 2]}
print(squared)


# 6:去重 l = [1,2,3,4,5,6,3,3,3,3,3,3]
# 用两种方式,第一种,给一个空list,判断添加
# 第二种,list ---->set

li = [1,2,3,4,5,6,3,3,3,3,3,3]
li = set(li)
print(li)



# 7:集合练习:
set1 = {'曹操','刘备','周瑜'} #经理
set2 = {'曹操','周瑜','张飞','赵云'} #技术员
# 经理有: 曹操,刘备,周瑜
# 技术员有: 曹操,周瑜,张飞,赵云
# 用集合求:
# 1即是经理也是技术员的有谁?
print(set1 & set2) # {4, 5}
# 2是经理,但不是技术员的有谁?
print(set1 - set2)
# 3是技术人员,但不是经理的都有谁?
print(set2 - set1)
# 4张飞是经理吗?
print('张飞' in set1)
# 5身兼一职的人都有谁?
print(set1 ^ set2)
# 6经理和技术员共有几个人?
print(set1 | set2)


# 输入一段字符串,打印所有输入过的字符串,但重复的只打印一次,(不要求打印的顺序与输入顺序一致)
# 输入: abcdabcaba
# 打印:
# a b c d
# se = set(input('请输入:'))
# print(se)


# 9输入一段字符串,打印出这个字符串中出现过的字符及出现过的次数:
# 如:
# 输入:abcdabcaba
# 打印如下:
# a: 4次
# b: 3次
# d: 1次
# c: 2次
# 注: 不要求打印顺序
# l = input("输入:")
# li = {}
# for i in l:
# if i not in li:
# li[i] = 1
# else:
# # li[i] += 1
# li[i] = li[i] + 1
# print(li)

# 10:把上次写的用户管理案例,按字典的形式改写一下



# s1 = 'python,java,php,go,c,python,java,php,go,c,python,java,php,go,c,'
# 统计每个单词出现的次数,
# 输出格式参看下面
s1 = 'python,java,php,go,c,python,java,php,go,c,python,java,php,go,c'
# l = s1.split(',')
# li = {}
# for i in l:
# if i not in li:
# li[i] = 1
# else:
# li[i] = li[i] + 1
#
# for k,v in li.items():
# print(f'{k},{v}次')



import collections
li = s1.split(',')
print(collections.Counter(li),'-----')
for w,c in collections.Counter(li).items():
print(w,c,sep=' : ')



posted @ 2020-07-17 16:43  Ric_A  阅读(119)  评论(0编辑  收藏  举报