zoukankan      html  css  js  c++  java
  • 07 list和dict for循环遍历索引问题以及深浅拷贝

    # lst = ['杨宗纬', '李荣浩', 'Jason', 'karen']
    
    # s = "_".join(lst)
    # print(s)  # 杨宗纬_李荣浩_Jason_karen
    
    # s = ""
    # for el in lst:
    #     s += el + '_'
    # print(s.strip('_'))   # 杨宗纬_李荣浩_Jason_karen
    字符串转化成列表:split()
    列表转化成字符串:join()
    x ->y 类型 y(x)
    表示False的数据类型:False, 0, "", [], tuple(), dict(), set(), None
    lst = ['王大锤', '王有才', '张小白', '刘大哥']
    lst.clear()  # 清空这个列表
    
    for el in lst:
         lst.remove(el)
     print(lst)      # ['王有才', '刘大哥'] 删除是不彻底的,原因是每次删除都会导致元素的移动,每次都会更新一次索引
     1.方案
    for i in range(0,len(lst)):
        lst.pop()
    print(lst)
     2方案把要删除的内容记录在一个新列表中
    new_lst = []
    for el in lst:
        new_lst.append(el)
    # 循环这个新列表,删除原来的列表
    for el in new_lst:
        lst.remove(el)
    print(lst)      # [] 注意, 删除的是老列表
    注意: 由于删除元素会导致元素的索引改变, 所以容易易出现问题. 尽量量不要再循环中直接去删
    除元素. 可以把要删除的元素添加到另⼀一个集合中然后再批量量删除.

    # 删除掉姓王的
    new_lst = []
    for el in lst:
        if el.startswith(""):
            new_lst.append(el)
    # 执行删除
    for el in new_lst:
        lst.remove(el)
    print(lst)

    dict for循环遍历索引问题

    dic = {"jay":'周杰伦', "jj":"林俊杰 ", "jack": "莱昂纳多迪卡普里奥"}
    dic.clear()
    print(dic)  # {}清空列表
    
    for k in dic:
        dic["haha"] = "王大锤"
    print(dic)          # RuntimeError: dictionary changed size during iteration

    lst = []
    for k in dic:
    lst.append(k)
    for el in lst:
    dic["haha"] = "王大锤"
    print(dic)

    for k in list(dic):
    dic["哈哈"] = "王大锤"
    print(dic)
    # fromkeys()  帮我们创建字典
    # d = dict.fromkeys("周杰伦", "王尼玛")
    # print(d) # {'周': '王尼玛', '杰': '王尼玛', '伦': '王尼玛'}
    # 坑1
    dic = {}
    # fromkeys是创建新字典。 不是在原有的基础上给你增加键值对
    d = dic.fromkeys("周杰伦", "王尼玛") # fromkeys是一个staticmethod  静态方法.
    print(dic)  # {}
    print(d)    # {'周': '王尼玛', '杰': '王尼玛', '伦': '王尼玛'}
    # 坑2
    你的value如果是可变的数据类型。 所有的key都可以改动这个数据。 一个改动, 所有的value都跟着改变
    d = dict.fromkeys("周杰伦",["哇哈哈"])
    print(d)        # {'周': ['哇哈哈'], '杰': ['哇哈哈'], '伦': ['哇哈哈']}
    d[""].append("爽歪歪")
    print(d)        # {'周': ['哇哈哈', '爽歪歪'], '杰': ['哇哈哈', '爽歪歪'], '伦': ['哇哈哈', '爽歪歪']}
    
    print(id(d[""]), id(d[""]), id(d[""]))
    2477155454536 2477155454536 2477155454536 id内存地址相等,变量指向同一个对象,

    2.集合set

    s = {1, 6, 1, 6, 1, 6,}
    print(type(s))
    print(s)
    字典:{}
    字典的key: 不可变,不能重复,底层存储是无序的,hash

    集合:{}
    集合里的元素:不可变,不能重复,底层也是无序的.hash

    集合其实就是字典,集合里面不存value, 集合中之存储key
    注意: set集合中的元素必须是可hash的, 但是set本⾝身是不可hash得. set是可变的.

    # 应用(重点) 去重复
    lst = ["周杰伦", "周杰伦", "王力宏", "王力宏", "胡辣汤"]
    s = set(lst) # 集合
    print(s)
    # 转化成列表
    print(list(s))

    应用(重点) 去重复
    lst = ["周杰伦", "周杰伦", "王力宏", "王力宏", "胡辣汤"]
    s = set(lst) # 集合
    print(s)
    # 转化成列表
    print(list(s))
    s = {1, 2} # 本身是可变的,不可哈希,但是内部的元素是不可变的
    s.add()
    print(s)

    list -> tuple
    set -> frozenset

    frozenset 可哈希的集合,不可变
    s = {[1, 2, 3, 4]}
    print(s)
    for el in s:
        print(el)  TypeError: unhashable type: 'list'
    
    s = frozenset([1, 2, 3, 4, 5])
    print(s)        # frozenset({1, 2, 3, 4, 5})
    for el in s:
        print(el)   # 1, 2, 3, 4, 5,

    set增删改查

    1,增

    s = {"刘嘉玲", '关之琳', "王祖贤"}
    s.add("郑裕玲")
    print(s)
    s.add("郑裕玲") # 重复的内容不不会被添加到set集合中
    print(s)            # {'关之琳', '刘嘉玲', '王祖贤', '郑裕玲'}
    s = {"刘嘉玲", '关之琳', "王祖贤"}
    s.update("麻花藤") # 迭代更更新     # {'刘嘉玲', '关之琳', '王祖贤', '藤', '麻', '花'}
    print(s)
    s.update(["张曼⽟玉", "李李若彤","李李若彤"])
    print(s)            # {'刘嘉玲', '关之琳', '李李若彤', '王祖贤', '藤', '麻', '张曼⽟玉', '花'}

    2.删

    s = {"刘嘉玲", '关之琳', "王祖贤","张曼⽟玉", "李李若彤"}
    item = s.pop() # 随机弹出⼀一个.
    print(s)    #王祖贤
    print(item) # {'刘嘉玲', '张曼⽟玉', '关之琳', '李李若彤'}
    s.remove("关之琳") # 直接删除元素
    # s.remove("⻢马⻁虎疼") # 不不存在这个元素.
    print(s)            # 删除会报错 KeyError: '关之琳'
    s.clear() # 清空set集合.需要注意的是set集合如果是空的. 打印出来是set() 因为要和dict区分的.
    print(s)   # set()

    3.修改

    set集合中的数据没有索引. 也没有办法去定位⼀一个元素. 所以没有办法进⾏行行直接修改.
    我们可以采⽤用先删除后添加的⽅方式来完成修改操作
    s = {"刘嘉玲", '关之琳', "王祖贤","张曼⽟玉", "李李若彤"}
    # 把刘嘉玲改成赵本⼭山
    s.remove("刘嘉玲")
    s.add("赵本⼭山")
    print(s)

    4.查

    # # set是⼀一个可迭代对象. 所以可以进⾏行行for循环
    for el in s:
      print(el)

    三.深浅拷贝

    = 没有产生新对象。 都是内存地址的赋值
    lst1 = ["孙悟空", "贝吉塔", "卡卡罗特"]
    lst2 = lst1 # 赋值
    
    lst1.append("短笛")
    #
    print(lst1)     # ['孙悟空', '贝吉塔', '卡卡罗特', '短笛']
    print(lst2)     # ['孙悟空', '贝吉塔', '卡卡罗特', '短笛']
    #
    print(id(lst1), id(lst2))  # 2559667703368 2559667703368

    copy 产生新的对象

    lst1 = ["孙悟空", "贝吉塔", "卡卡罗特"]
    # lst2 = lst1[:] # [:] 在原来的数据中获取到所有的数据组成新的列表
    lst2 = lst1.copy() #  拷贝会帮我们创建新对象
    
    lst1.append("短笛")
    
    print(lst1)     # ['孙悟空', '贝吉塔', '卡卡罗特', '短笛']
    print(lst2)     # ['孙悟空', '贝吉塔', '卡卡罗特']
    print(id(lst1), id(lst2))   # 2314216574536 2314216592712
    浅拷贝的问题
    优点: 省内存.
    缺点: 容易出现同一个对象被多个变量所引用
    lst1.append("短笛")
    lst1[3].append("巴啦啦小魔仙")
    print(lst1)  # ['孙悟空', '贝吉塔', '卡卡罗特', ['七龙珠', '战斗陀螺', '巴啦啦小魔仙'], '短笛']
    print(lst2)  # ['孙悟空', '贝吉塔', '卡卡罗特', ['七龙珠', '战斗陀螺', '巴啦啦小魔仙']]
    print(id(lst1), id(lst2))  # 1645927978312 1645927979016
    深拷贝
    优点: 完全拷贝出一份两个对象之间除了数据相同。 没有任何关系
    缺点: 占内存
    import copy # 引入拷贝模块
    lst1 = ["孙悟空", "贝吉塔", "卡卡罗特",["七龙珠","战斗陀螺"]]
    lst2 = copy.deepcopy(lst1) # 会把这个对象相关的内部信息全部复制一份
    
    lst1[3].append("巴啦啦小魔仙")
    print(lst1)  #  ['孙悟空', '贝吉塔', '卡卡罗特', ['七龙珠', '战斗陀螺', '巴啦啦小魔仙']]
    print(lst2)  #  ['孙悟空', '贝吉塔', '卡卡罗特', ['七龙珠', '战斗陀螺']]
    
    print(id(lst1), id(lst2))  # 2051104469192 2051104470472
    # 共同有点: 快速创建对象  -> 原型模式(设计模式)





  • 相关阅读:
    面向使用的软件设计随笔04
    面向使用的软件设计随笔03
    面向使用的软件设计随笔02
    面向使用的软件设计随笔01
    阅读笔记16
    阅读笔记15
    阅读笔记14
    阅读笔记13
    如何在Mac OS X上安装 Ruby运行环境
    IOS开发隐藏键盘的4种方法
  • 原文地址:https://www.cnblogs.com/zero-zero-zero/p/9853165.html
Copyright © 2011-2022 走看看