zoukankan      html  css  js  c++  java
  • Day07-set基础知识跟一些常见坑

    set集合,深浅复制及一些常见知识点补充

    set集合
    一、无序的. 不重复的. 内容必须是可哈希的数据类型.
    本身是不可哈希
    添加:add(),update(),
    删除:pop()
    查询:可迭代对象需要可哈希的时候用frozenset()

    dic = {"朱元璋":"明太祖", "朱棣":"明成祖", "朱元璋":"朱重八"}
    dic['朱元璋'] = "和尚"
    print(dic) #执行后朱元璋对应的值会被改成和尚
    # set就是存储的key, set集合不会重复, 无序
    s = {"朱元璋", "朱元璋", "朱棣"}
    print(s) #执行完只会剩下一个朱元璋
    s = {"alex", 1, True, {"你好"}}
    s = {"马虎疼", [1,4,7]} # 不合法. [] 列表是不可哈希的
    s = {"呵呵", "哈哈", "吼吼", (1, 4, 7)}
    print(s)
    前两个执行会报错因为其内部元素存在不可hash类型的,集合中元素必须是可哈希的。

    #去重复

    lst = [1,4,7,1,4,5,6,7,8,2,1,3,9]
    s = set(lst)
    lst = list(s)
    print(lst)
    执行结果会返回没有重复元素的列表

    迭代更新
    s = {"李谷一", "周润发", "邓丽君", "黄家驹", "张国荣"}
    s.update("中岛美嘉") # 迭代更新
    print(s)
    返回结果会把"中岛美嘉"每个字迭代填充进这个集合中

    若要将名字整体放进去需要将其放进列表中(如下)
    s.update(["中岛美雪", "很牛B"])
    print(s)
    这样列表中两个字符串就会被填充进集合中

    s1 = {"刘能", "赵四", "皮长山"}
    s2 = {"刘科长", "冯乡长", "皮长山"}

    求交集
    print(s1 & s2)
    print(s1.intersection(s2)) # 交集
    # 并集
    print(s1 | s2)
    print(s1.union(s2)) # 并集
    差集, 把自己本身中和对方不相关的内容留下
    print(s2 - s1)
    print(s2.difference(s1))

    s1 = frozen(s) s1就会变成不可变、可哈希类型
    index = 1
    while index < 11:
    index = index + 1
    if index == 5:
    break
    print(index)
    else:
    print("哈哈哈")
    print("呵呵")
    该程序将会打印2 3 4 呵呵 需注意的是等式都是先计算等号右边的
    二、list涉及到常见坑
    lst = ["黄飞鸿", "霍元甲", "十三姨", "鬼脚七"]
    s = "_*_".join(lst) # 把列表变成字符串. 用前面的字符串把列表的元素连接起来, 返回新字符串
    print(s)
    返回是列表中元素被前面元素连接起来的新的字符串:黄飞鸿_*_霍元甲_*_十三姨_*_鬼脚七
    s = "金毛狮王"
    s1 = "_".join(s) # 迭代把每一项进行拼接
    print(s1) # 金毛狮王
    返回的是金_毛_狮_王

    list的删除有大坑需要注意,具体见下面解释:
    lst = ["倚天屠龙记", "诛仙", "看见", "追风筝的人"]
    for i in lst:
    lst.remove(i)
    print(lst)
    返回结果会剩下诛仙跟追风筝的人,因为在for运行过程中会有一个指针来记录当前循环的元素是哪一个,一开始这个指针指向第0个并获取这个元素紧接着会删除这个元素,然后第一个元素会自动变成第0个然后指针向后移动一次指向诛仙,这时这个诛仙就会被自动滤过不被删除。
    for i in range(0, len(lst)):
    lst.pop()
    print(lst) #这种能够满足要求,因为此时i是计算删除的次数且正好是被删列表的长度
    下面这种方式是最合理、容易理解的删除方式
    # 把要删除的东西保存在一个新列表中
    new_lst = []
    for el in lst:
    new_lst.append(el)
    # 循环新列表. 删除老列表
    for e in new_lst:
    lst.remove(e)
    print(lst)# 把第一个参数中的每一项拿出来和第二个参数组成一个键值对
    #  生成出来的键指向的value是同一个对象. 改变其中一个的时候. 另一个也会跟着改变
    dic = dict.fromkeys(["jay", "jj"], ["周杰伦", "林俊杰"])
    dic['jay'].append("蔡依林")
    print(dic)
    第一个dic其实生成的值右边这个字典{'jay': ['周杰伦', '林俊杰'], 'jj': ['周杰伦', '林俊杰']},第二项被当成一个值由前面两个键共享.
    第二个dic生成两个值都包含"蔡依林"的字典

    三、集合常见错误点及深浅复制
    dict中的元素在迭代过程中是不允许被删除的
    dic = {"a":'老A', 'b':"王宝强", 'c':"蓉姐", 'd':'百合姐'}
    for k in dic:
      if 'k' in k:
        del dic[k]
    print(dic)
    这时会报错,因被删除的元素在迭代过程中。

    要想删除需先将要删除的元素保存在一个列表中,然后循环该列表,再删除
    dic = {"a":'老A', 'b':"王宝强", 'c':"蓉姐", 'd':'百合姐'}
    dic_del_list = []
    #删除key中带有'a'的元素
    for k in dic:
      if 'a' in k:
        dic_del_list.append(k)
    for el in
    dic_del_list:
      del dic[el]
    print(dic)
    深浅复制:

    deepcopy会将原来的对象完整复制给另一个对象



    认真做一件事,并将之完全学会掌握为止!
  • 相关阅读:
    MyBatis中Like语句使用总结
    使用dom4j解析xml为json对象
    实体类里布尔类型在数据库里可以用整型映射
    Java枚举根据key获取value
    Oracle和Mysql中mybatis模糊匹配查询区别
    解决3 字节的 UTF-8 序列的字节 3 无效
    git上传代码到github
    OpenShift 3.11离线环境的jenkins演示
    OpenShift下的JVM监控
    OpenShift 4.1 演示
  • 原文地址:https://www.cnblogs.com/wr13640959765/p/9151040.html
Copyright © 2011-2022 走看看