• python入门13 集合set


    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!

  • 相关阅读:
    String.format in JavaScript
    dojo/domReady! 中感叹号的作用
    文本三剑客之sed的用法
    文本三剑客之grep的用法
    通配符与特殊符号
    文件属性信息
    文件属性及find命令总结
    linux系统常用命令
    系统优化
    vim编辑器 与etc目录
  • 原文地址:https://www.cnblogs.com/dinghanhua/p/9941102.html
Copyright © 2020-2023  润新知