zoukankan      html  css  js  c++  java
  • 基础数据类型补充、集合、深浅拷贝

    基础数据类型补充

    元组

    如果元组中只有一个数据,且没有逗号,则该 '元组' 与里面的数据的数据类型相同。

    >>> tu1 = (2,)
    >>> tu2 = ('hello')
    >>> tu3 = ([1, 2], )
    >>> tu1, type(tu1)
    ((2,), <class 'tuple'>)
    >>> tu2, type(tu2)
    ('hello', <class 'str'>)
    >>> tu3, type(tu3)
    (([1, 2],), <class 'tuple'>)
    

    列表

    • 列表与列表可以相加
    >>> l1 = [1, 2, 3]
    >>> l2 = [5, 6, 7]
    >>> l1 + l2
    [1, 2, 3, 5, 6, 7]
    

    l1 = [11, 22, 33, 44, 55, 66, 77, 88]将列表中索引为奇数的元素,全部删除

    • 在循环一个列表时,如果对列表中的某些元素进行删除,
    • 那么此元素后面的所有元素就会向前进一位,他们的索引就会发生变化。

    在循环一个列表时,最好不要对此列表进行改变大小(增删)的操作。

    1. 方法1:切片+步长删除
    >>> l1 = [11, 22, 33, 44, 55, 66, 77, 88]
    >>> del l1[1::2]
    >>> l1
    [11, 33, 55, 77]
    
    1. 方法2:利用另外的空列表
    l1 = [11, 22, 33, 44, 55, 66, 77, 88]
    l2 = []
    
    for i in range(len(l1)):
        if i % 2 == 0:
            l2.append(l1[i])
    print(l2) #[11, 33, 55, 77]
    l1 = l2
    
    1. 方法3:倒着删
    l1 = [11, 22, 33, 44, 55, 66, 77, 88]
    for index in range(len(l1)-1, -1, -1):
        if index % 2 == 1:
            l1.pop(index)
    print(l1)
    
    1. 方法4:正着删(因为每次删除一个元素,列表里的元素会自动向前挪动,最前面的那个元素刚好挪动到删除的位置上,下次删除不会再删除它了,所以可以实现隔着删除的功能)
    l1 = [11, 22, 33, 44, 55, 66, 77, 88]
    
    for i in l1:
        if i != l1[0]:
            l1.pop(l1.index(i))
    print(l1) # [11, 33, 55, 77]
    

    字典

    • 在循环一个字典时,千万不要对此列表进行改变大小(增删)的操作。

    dict.fromkeys() 注意是dict或是字典对象的方法

    >>> dic = dict.fromkeys('abc', 1)
    >>> dic
    {'a': 1, 'b': 1, 'c': 1}
    >>> dic2 = dict.fromkeys([1, 2, 3], 'hello')
    >>> dic2
    {1: 'hello', 2: 'hello', 3: 'hello'}
    
    >>> dic = {'a':1, 'b':2}
    >>> dic.fromkeys('abc', 1)
    {'a': 1, 'b': 1, 'c': 1}
    
    • 陷阱 若fromkeys()第二个参数为列表、字典,更改其中一个,其他都会变的。
    >>> dic = dict.fromkeys('123', [])
    
    >>> dic['1'].append(666)
    >>> dic['2']
    [666]
    >>> dic['3']
    [666]
    

    集合(set)

    >>> a = set('abc') # set()里面的参数是必须是可迭代的。
    >>> a
    {'b', 'a', 'c'}
    
    >>> b = set() # set()表示是空集合,
    >>> b
    set()
    >>> bool(b)  
    False
    
    >>> a = set([1,2,3])
    >>> a
    {1, 2, 3}
    

    >>> a = {1, 2, 3}
    >>> a.add(4)
    >>> a
    {1, 2, 3, 4}
    
    >>> a.add('abc') # 只加一个元素
    >>> a
    {'abc', 1, 2, 3, 4}
    >>> a.update('ijk')  # 迭代着加
    >>> a
    {'abc', 1, 2, 3, 4, 'j', 'i', 'k'}
    

    remove()

    >>> a
    {'abc', 1, 2, 3, 4, 'j', 'i', 'k'}
    >>> a.remove('a')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'a'
    >>> a.remove('abc')
    >>> a
    {1, 2, 3, 4, 'j', 'i', 'k'}
    

    pop()

    >>> a.pop()
    1
    

    clear()

    >>> a.clear()
    >>> a
    set()
    

    del

    >>> del a
    >>> a
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'a' is not defined
    

    关系测试

    >>> set1 = {1, 2, 3, 4}
    >>> set2 = {3, 4, 5, 6}
    
    >>> set1 & set2    # 交集
    {3, 4}
    >>> set1.intersection(set2)
    {3, 4}
    
    >>> set1 | set2     # 并集
    {1, 2, 3, 4, 5, 6}
    >>> set1.union(set2)
    {1, 2, 3, 4, 5, 6}
    
    >>> set1 ^ set2     # 反交集
    {1, 2, 5, 6}
    >>> set1.symmetric_difference(set2)
    {1, 2, 5, 6}
    
    >>> set1 - set2     # 差集
    {1, 2}
    
    >>> set1 = {1, 2}
    >>> set2 = {1, 2, 3, 4}
    
    >>> set1 < set2     # 子集
    True
    >>> set1.issubset(set2)
    True
    
    >>> set2 > set1     # 超集
    True
    >>> set2.issuperset(set1)
    True
    

    frozenset 不可变的数据类型。 ★★★☆☆

    >>> set1 = {1, 2}
    >>> set2 = frozenset(set1)
    >>> set2
    frozenset({1, 2})
    >>> {set2: '可以做键'}
    {frozenset({1, 2}): '可以做键'}
    

    深浅拷贝

    浅拷贝只适用于list, set, dict,用copy()方法,而list的全切lst[:]也是浅拷贝

    只会拷贝第一层,从第二层开始不会拷贝。
    第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性

    但是由于有代码块和小数据池的作用,第一层的id会都一样,类似两套格局相同的房子都是同一个人的名下。

    >>> a = [1,2]
    >>> b = a.copy()
    >>> c = (1,2)
    >>> d = c.copy()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'tuple' object has no attribute 'copy'
    >>> e = {'a':1, 'b':2}
    >>> f = e.copy()
    >>> g = {1, 2, 3}
    >>> h = g.copy()
    >>> 'asdlf'.copy()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'str' object has no attribute 'copy'
    
    >>> l1 = [1, 2, 3]
    >>> l2 = l1.copy()
    >>> id(l1[1])
    1780834560
    >>> id(l2[1])
    1780834560
    >>> l1 = [1, 2, 3, 'python']
    >>> l2 = l1.copy()
    >>> id(l1[-1])
    2641351388888
    >>> id(l2[-1])
    2641351388888
    
    >>> l3 = [[1,2], 3]
    >>> l4 = l3.copy()
    >>> id(l3[0])
    2641351422152
    >>> id(l4[0])
    2641351422152
    >>> l4[0].append(4)
    >>> l3
    [[1, 2, 4], 3]
    

    对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。

    >>> import copy
    >>> l3
    [[1, 2, 4], 3]
    >>> l5 = copy.deepcopy(l3)
    >>> l3[0].append(666)
    >>> l5
    [[1, 2, 4], 3]
    >>> l3
    [[1, 2, 4, 666], 3]
    
  • 相关阅读:
    多线程博文地址 http://www.cnblogs.com/nokiaguy/archive/2008/07/13/1241817.html
    vs2010一运行就报错deven.exe assert failure 解决方法,卸载系统中.netFramework最新版本的(简体中文)
    Lambda语句中创建自定义类型时,也可指定某种特定类型,方法是在new与{}之间写上类型名称
    Win7开始菜单所在目录
    C#中Struct与Class的区别
    Linq语句:三表联查
    用exp、dmp导入导出用户到同一个实例下时,类型type会有问题
    列、约束重命名,原数据不丢失
    CDM中,创建一个或多个组合属性的唯一约束
    EF中新建表和关联表的方法
  • 原文地址:https://www.cnblogs.com/lanhoo/p/9508284.html
Copyright © 2011-2022 走看看