zoukankan      html  css  js  c++  java
  • 深浅copy及循环删除注意事项

    字符串中的join方法

    将列表转换成字符串,每个元素间用"内容"拼接,

    join(可迭代对象)

    s = ["高华新","刘清扬","崔园樟"]
    s1 = "-".join(s)
    print(s1) >>> 高华新-刘清扬-崔园樟

    split() 字符串转换成列表

    ss = "高华新**刘清扬**崔园樟"
    print(ss.split("**")) >>> ['高华新', '刘清扬', '崔园樟']

    列表和字典在循环的时候不能直接删除,需要把删除的内容放在一个新列表中,然后再循环新列表,再删除字典和列表中所对应的内容

    列表的直接remove删除:

    lst = ["紫云", "大云", "玉溪", "紫钻","a","b"]
    for el in lst:   # 有一个变量来记录当前循环的位置
        lst.remove(el)
    print(lst)  >>>  ['大云', '紫钻', 'b']                  
    #删除的时候, 发现. 剩余了一下内容. 原因是内部的索引在改变.
    # # 需要把要删除的内容记录下来. 然后循环这个记录. 删除原来的列表

    创建新列表删除

    lst = ["紫云", "大云", "玉溪", "紫钻","a","b"]
    li = []
    for i in lst:      # 遍历列表中的元素
        li.append(i)    #将将删除的元素添加到新列表中 
    for i in li:        #遍历新列表中的元素  
        lst.remove(i)       #旧列表删除内容,因为遍历的是新列表中的元素,所以原来的列表元素位置就不会自动往前走,不会内部循环
                            # 是最安全的
    print(lst) >>> []       # 空列表
    lst = ["张国荣", '张铁林', '张国立', "张曼玉", "汪峰"]
    # 删掉姓张的
    
    zhangs = []
    for el in lst:
        if el.startswith("张"):    # 记录姓张的.
            zhangs.append(el)       #将姓张的放在新列表中
    for el in zhangs:               #遍历新列表
        lst.remove(el)              #删除老列表中姓张的
    print(lst)  >>>  ['汪峰']
    print(zhangs) >>> ['张国荣', '张铁林', '张国立', '张曼玉']  #新列表中全是姓张的

    字典

    dic = {"提莫":"冯提莫", "发姐":"陈一发儿", "55开":"卢本伟"}
    lst = []
    for i in dic:
        lst.append(i)
    for i in lst:
        dic.pop(i)
    print(dic)  >>> {}

    formkeys()

    直接用类(class)访问,返回新字典,对原字典没有影响

    后面的value是多个key共享一个value

    dic = {"apple":"苹果", "banana":"香蕉"}
    print(dic.fromkeys("apple","苹果"))  
    >>>
     {'a': '苹果', 'p': '苹果', 'l': '苹果', 'e': '苹果'} #形成新字典,与原字典无关联,遍历前面形成key,共享后面一个value
    print(dic.fromkeys("ab",["苹果","橘子"]))
    >>> 
    {'a': ['苹果', '橘子'], 'b': ['苹果', '橘子']}
    dic = {"apple":"苹果", "banana":"香蕉"}
    # 返回新字典. 和原来的没关系
    ret = dic.fromkeys("orange", "橘子") # 直接用字典去访问fromkeys不会对字典产生影响
    ret = dict.fromkeys("abc",["哈哈","呵呵", "吼吼"]) # fromkeys直接使用类名进行访问
    print(ret)
    >>>
    {'a': ['哈哈', '呵呵', '吼吼'], 'b': ['哈哈', '呵呵', '吼吼'], 'c': ['哈哈', '呵呵', '吼吼']}
    a = ["哈哈","呵呵", "吼吼"]
    ret = dict.fromkeys("abc", a) # fromkeys直接使用类名进行访问
    a.append("嘻嘻")
    print(ret) 
    >>>
    {'a': ['哈哈', '呵呵', '吼吼', '嘻嘻'], 'b': ['哈哈', '呵呵', '吼吼', '嘻嘻'], 'c': ['哈哈', '呵呵', '吼吼', '嘻嘻']}

    set集合

    特点:无顺序,不重复,里面元素是可哈希(不可变)的

    作用:用来去重

    本身是可变的数据类型,有增删改查操作

    frozenset()冻结的集合. 不可变的. 可哈希的,冻结后集合不能再添加或删除任何元素。

    s = {"周杰伦", "的老婆","叫昆凌", (1,2,3), "周杰伦"}
    lst = [11,5,4,1,2,5,4,1,25,2,1,4,5,5]
    s = set(lst)    # 把列表转换成集合. 进行去重复
    lst = list(s)   # 把集合转换回列表.
    print(lst) >>> [1, 2, 4, 5, 11, 25]  #去重
    
    # 集合本身是可变的数据类型, 不可哈希, 有增删改查操作
    s = {"刘嘉玲", '关之琳', "王祖贤"}
    s.update("麻花藤")    # 迭代更新 无序
    print(s) >>> {'王祖贤', '关之琳', '藤', '花', '刘嘉玲', '麻'}

    深浅拷贝

    赋值, 没有创建新对象. 共用同一个对象,他们是相同的,赋值后的变量指向原有的内存地址

    浅拷贝.

    拷贝第一层内容.不拷贝内部子对象,用 [:]或copy() 

    lst1 = ["金毛狮王", "紫衫龙王", "青翼蝠王", "白眉鹰王",["张无忌","赵敏","周芷若"]]
    print(lst1.copy())  #浅拷贝  拷贝出来的列表第一层与原来是不同的内存地址,第二层指向原来的地址 
    >>>
    ['金毛狮王', '紫衫龙王', '青翼蝠王', '白眉鹰王', ['张无忌', '赵敏', '周芷若']] 
    print(lst1[:]) #浅拷贝  
    >>> 
    ['金毛狮王', '紫衫龙王', '青翼蝠王', '白眉鹰王', ['张无忌', '赵敏', '周芷若']] 

    深拷贝.

    拷贝所有内容. 包括内部的所有,形成一个新的对象,虽然与之前的值和内容一模一样,但是它们完完全全的两个对象,用deepcopy()

    lst1 = ["金毛狮王", "紫衫龙王", "青翼蝠王", "白眉鹰王",["张无忌","赵敏","周芷若"]]
    lst2 = copy.deepcopy(lst1)
    print(lst2)   >>>  ["金毛狮王", "紫衫龙王", "青翼蝠王", "白眉鹰王",["张无忌","赵敏","周芷若"]]
    print(id(lst1)) >>> 358961124936
    print(id(lst2)) >>> 358961315656
    # lst1和lst2 是两个不同内存地址的
     
  • 相关阅读:
    Echart 动态生成series数据
    转换Excel格式
    .NET接收邮件下载邮件附件——openpop.net
    百度Echart 地图
    mobiscroll 日期问题
    jQuery自动完成插件flexselect
    HTML5 video 连续播放视频
    team foundation server 工具的使用
    实现主成分分析与白化
    白化(预处理步骤)【转】
  • 原文地址:https://www.cnblogs.com/shangping/p/11848813.html
Copyright © 2011-2022 走看看