set集合与数学中的集合同一个概念,是无序不重复元素组成的。
#coding:utf-8 #/usr/bin/python """ 2018-11-10 dinghanhua 集合 """ '''集合是无序的不重复的元素序列,不支持索引''' '''定义''' set1 = {1,2,3,2} print(set1) #元素不重复 set2 = set('python is easy to use') print(set2)
'''set用于list,string去重''' li = ['peter','jary','peter','fee'] set_list = list(set(li)) #set > list print('取list不重复的数据',set_list) str1 = 'jwejfewfjewpfjepw' set_str = str(set(str1)) print('set用于取字符串的不重复字符:',set_str)
'''添加、删除元素、长度、元素是否存在''' set1.add('grape') print(set1) set2.update(['watermelon']) set2.update(('pear','apple')) set2.update({'whatever'}) print(set2) set2.remove('apple') set2.discard('tomato') which = set2.pop() #随机删 print(which) print(set2) #长度 print(len(set1)) #清空 set1.clear() print(set1) #是否包含某元素 print( 'apple' in set2)
'''集合的运算:并集、差集、交集''' set1 = {'apple','pear','banana'} set2 = {'peach','orange','tomato','potato','pear'} set3 = {'banana'} print('交集 在set1,set2同时存在的',set1&set2) print(set1.intersection(set2)) print('差集,在set1,不在set2的',set1-set2) print(set1.difference(set2)) print('只在一个集合里的',set1^set2) print(set1.symmetric_difference(set2)) print('并集,在set1或set2的',set1 | set2) print(set1.union(set2)) print(set1.isdisjoint(set2)) #是否没有交集 有交集-False,没交集-True print(set3.issubset(set2)) #set3是否是set2的子集 print(set1.issuperset(set3)) #set1是否是set3的父集
'''练习:a和b大列表去重''' a = [1,3,5,3,2,6] b = [3,2,2,6,4] c = [] for x in a+b: if x not in c: c.append(x) print(c)
ss = list(set(a+b)) #set的不重复性去重 c1 = sorted(list(set(a+b)),key = (a+b).index) print(c1)
li = {}.fromkeys(a+b).keys() #利用字典keys不重复特性去重
'''练习:去除姓氏(只考虑单姓)相同的人员,保留最后一个''' li = ['刘能','王老七','谢广坤','赵玉田','杨晓燕','刘大脑袋','王长贵','谢飞及','赵四','王大拿'] # 从后往前遍历每个元素,当姓氏不存在与姓氏列表中则分别插入姓名和姓氏 linew = [] lixing = [] for x in li[::-1]: #从后往前取 if x[0] not in lixing: #姓氏不存在,则插入姓氏,插入人名 linew.insert(0,x) #在第一个位置插入人名,保持顺序 lixing.append(x[0]) #插入姓氏 print(linew)
linew = [] for x in li[::-1]: #从后往前取 if x[0] not in set([y[0] for y in linew]): #姓氏在新列表中不存在 linew.insert(0,x) print(linew)
# 取出所有姓氏,从后往前遍历,遍历到所有姓氏均取出一个姓名为止 set_xing = set([x[0] for x in li]) #取出所有的姓氏 linew = [] for x in li[::-1]: if x[0] in set_xing: linew.insert(0,x) #匹配一个插入一个 set_xing.remove(x[0]) #匹配上的姓去掉 if len(set_xing) == 0: break #集合为空跳出循环 print(linew) # 取出所有姓氏,遍历姓氏在列表中的索引,取索引对应的姓名 li_xing = [x[0] for x in li[::-1]] #倒着取出姓氏 set_xing = sorted(list(set(li_xing)),key = lixing.index) #取出姓氏集合,转化为列表保持与列表同一顺序 linew = [] for x in set_xing: xindex = li_xing.index(x) #取姓在姓氏列表里面的索引 linew.insert(0,li[::-1][xindex]) #根据索引取名字 print(linew) # map函数 def func(x): for y in li[::-1]: if x[0] == y[0]: return y li2 = set(map(func,li)) print(li2) # 取出所有姓氏,遍历集合,在列表从后往前找匹配的姓名 set_xing = set( [x[0] for x in li]) #取出姓氏集合 linew = [] for x in set_xing: for name in li[::-1]: if name.startswith(x): linew.append(name) break print(sorted(linew,key = li.index))
# dict key的不重复特性 dict_name = {} for name in li: dict_name[name[0]] = name print(dict_name)
the end!