• 数据类型:集合数据类型(set)


    集合数据类型(set)

    一特点

    1、无序、去重
    2、元素是字符串类型
    3、最多包含2^32-1个元素

    二基本命令

    # 1、增加一个或者多个元素,自动去重
        SADD key member1 member2
    # 2、查看集合中所有元素
        SMEMBERS key
    # 3、删除一个或者多个元素,元素不存在自动忽略
        SREM key member1 member2
    # 4、元素是否存在
        SISMEMBER key member
    # 5、随机返回集合中指定个数的元素,默认为1个
        SRANDMEMBER key [count]
    # 6、弹出成员  (默认为1)随机弹出
        SPOP key [count]
    # 7、返回集合中元素的个数,不会遍历整个集合,只是存储在键当中了
        SCARD key
    # 8、把元素从源集合移动到目标集合
        SMOVE source destination member
        例句:smove myset1 myset2 2
            将myset1中的2移动到myset2里面(相当于剪切)
    # 9、差集(number1 1 2 3 number2 1 2 4)
    #差集:number里面有的 number里面没有的
        SDIFF key1 key2  
    # 10、差集保存到另一个集合中
        SDIFFSTORE destination key1 key2
    # 11、交集(两个里面都有的)
        SINTER key1 key2
        #将交集的数据复制给新的set 
        SINTERSTORE destination key1 key2
    # 11、并集(合在一起去掉重复的)
        SUNION key1 key2
        SUNIONSTORE destination key1 key2

    python操作set

    # 1、给name对应的集合中添加元素
    sadd(name,values)
    r.sadd("set_name","tom")
    r.sadd("set_name","tom","jim")
    
    # 2、获取name对应的集合的所有成员: 集合
    smembers(name)
    
    # 3、获取name对应的集合中的元素个数
    scard(name)
    r.scard("set_name")
    
    # 4、检查value是否是name对应的集合内的元素:True|False
    sismember(name, value)
    
    # 5、随机删除并返回指定集合的一个元素
    spop(name)
    mumber = r.spop('set_name')
    
    # 6、删除集合中的某个元素
    srem(name, value) 
    r.srem("set_name", "tom")
    
    # 7、获取多个name对应集合的交集
    sinter(keys, *args)
    
    r.sadd("set_name","a","b")
    r.sadd("set_name1","b","c")
    r.sadd("set_name2","b","c","d")
    
    print(r.sinter("set_name","set_name1","set_name2"))
    #输出:{b'b'}
    
    # 8、获取多个name对应的集合的并集
    sunion(keys, *args)
    r.sunion("set_name","set_name1","set_name2")

    案例: 新浪微博的共同关注

    需求: 当用户访问另一个用户的时候,会显示出两个用户共同关注过哪些相同的用户

    设计: 将每个用户关注的用户放在集合中,求交集即可

    实现:

      user001 = {'peiqi','qiaozhi','danni'}

      user002 = {'peiqi','qiaozhi','lingyang'}

      user001和user002的共同关注为:

      SINTER user001 user002

    结果为: {'peiqi','qiaozhi'}

    import redis
    
    r = redis.Redis(host='192.168.153.136',port=6379,db=0)
    
    # 用户1关注的人
    r.sadd('user_first','peiqi','qiaozhi','danni')
    # 用户2关注的人
    r.sadd('user_second','peiqi','qiaozhi','lingyang')
    
    # user_first和user_second的共同关注的人为??求差集
    result = r.sinter('user_first','user_second')
    # 把集合中的每个元素转为string数据类型
    focus_on_set = set()
    for r in result:
        focus_on_set.add(r.decode())
    
    print(focus_on_set)
  • 相关阅读:
    【NOIP2007提高组T4】树网的核-Floyd最短路+枚举
    【NOIP2007提高组T4】树网的核-Floyd最短路+枚举
    【NOIP2008提高组T4】双栈排序-二分图染色
    【NOIP2008提高组T4】双栈排序-二分图染色
    【NOIP2010提高组T4】引水入城-搜索+DP
    【NOIP2010提高组T4】引水入城-搜索+DP
    【NOIP2011提高组T5】聪明的质监员-二分答案+前缀和
    【NOIP2011提高组T5】聪明的质监员-二分答案+前缀和
    POJ 1113 Wall
    BZOJ 1412 狼和羊的故事
  • 原文地址:https://www.cnblogs.com/maplethefox/p/11309466.html
Copyright © 2020-2023  润新知