Python基础(二)—列表和元组

Posted on 2019-05-19 09:54  走过萧萧路  阅读(77)  评论(0编辑  收藏  举报

List&Tuple

List是一个可变序列类型。因此,您可以通过添加或删除元素来更改给定的列表。元组是不变序列类型。你不能换一个元组。所以你必须创建一个新的。

  • List
    • 创建:listTmp = [] , listTmp = [‘listtmp’, 2017, 2018, 2019]
    • 访问:通过下标进行访问(和字符串同样可以使用切片),listTmp[0] , listTmp[1,3]
    • 增加:append()、或者通过下标进行组合新增或删除等操作。listTmp.append(2020) # ‘listtmp’, 2017, 2018, 2019, 2020
    • 删除:listTmp.pop()(该方法默认删除最后一个)、 listTmp.remove(2018)(移除列表中某个值的第一个匹配项)、 del listTmp2
      listTmp = [2, 5, 7, '2019', '2010', 'ABCD']
      print(listTmp.pop())
    
      listTmp.remove(7)
      print(listTmp)
    
      del listTmp[2]
      print(listTmp)
      '''
      ABCD
      [2, 5, '2019', '2010']
      [2, 5, '2010']
      '''
    
    
  • Tuple
    • 创建:tupleTmp = () , tupleTmp = (‘listtmp’, 2017, 2018, 2019)
    • 访问:通过下标进行访问(和字符串同样可以使用切片),tupleTmp[0] , tupleTmp[1,3]
    • 增加:元组中的元素值是不允许修改的,但我们可以对元组进行连接组合。
    • 删除:元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组。
      tupleTmp = ('loak', 2017, 2018, 2019)
    
      print(tupleTmp[0])
      tupleTest = 1
      newTuple = tupleTmp + (tupleTest,)  # 元组中的元素只能连接组合进行增加
      print(newTuple)'
    
      del tupleTmp
    
    

列表和元组的运算

  • 列表
    列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。
Python 表达式结果描述
len([1, 2, 3])3长度
[1, 2, 3] + [4, 5, 6][1, 2, 3, 4, 5, 6]组合
[‘Hi!’] * 4[‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’]重复
3 in [1, 2, 3]True元素是否存在于列表中
for x in [1, 2, 3]: print(x, end=" ")1 2 3迭代
  • 元组
    与字符串一样,元组之间可以使用 + 号和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。
Python 表达式结果描述
len((1, 2, 3))3计算元素个数
(1, 2, 3) + (4, 5, 6)(1, 2, 3, 4, 5, 6)连接
(‘Hi!’,) * 4(‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’)复制
3 in (1, 2, 3)True元素是否存在
for x in (1, 2, 3): print (x,)1 2 3迭代

内置函数

  • 列表
序号函数描述
1len(list)列表元素个数
2max(list)、min(list)返回列表元素最大、最小值
3list(seq)将元组转换为列表
4list.append(obj)在列表末尾添加新的对象
5list.count()统计某个元素在列表中出现的次数
6list.extend(seq)在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
7list.index(obj)从列表中找出某个值第一个匹配项的索引位置
8list.insert(index, obj)将对象插入列表
9list.pop([index=-1])移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
10list.remove(obj)移除列表中某个值的第一个匹配项
11list.reverse()反向列表中元素
12list.sort( key=None, reverse=False)对原列表进行排序
13list.clear()清空列表
14list.copy()复制列表
  • 元组
序号函数描述
1len(tuple)计算元组元素个数
2max(tuple)、min(tuple)返回元组元素最大、最小小值
3tuple(seq)将列表转换为元组

关于列表和元组的深浅复制

  • Python对象和变量的管理
    Python没有C语言中的变量。在C语言中,变量不止是个名字,它是字节集合并真实存在于内存某个位置上。而在Python中,变量仅仅是指向对象的标签。
      a = [1, 2, 3]  # 表示我们创建了一个指引指向列表[1, 2, 3],但是a不是列表
    
      b = a  # 此时并没有复制a所指引的列表。我们只是创建了一个新的标签b,然后将其指向a所指向的列表。如果修改a,那你就同时修改了b,因为它们指向同一个列表。
    
      # 可以使用内建函数id()可以返回对象的唯一id。该id是对象的内存地址。
      c = []
      print(id(a))
      print(id(b))
      print(id(c))
      '''输出:
        10784000
        10784000
        10304448
      '''
    

浅复制.png

  • 五种复制方式的比较

      import copy
      a = [[1], 2, 3]
      b = a[:]
      c = list(a)
      d = a * 1
      e = copy.copy(a)
      f = copy.deepcopy(a)
    
      a[0].append(4)
    
      print('a                ', id(a), a)
      print('a[:]             ', id(b), b)
      print('list(a)          ', id(c), c)
      print('a * 1            ', id(d), d)
      print('copy.copy(a)     ', id(e), e)
      print('copy.deepcopy(a) ', id(f), f)
      '''
        a                 9303824 [[1, 4], 2, 3]
        a[:]              9304864 [[1, 4], 2, 3]
        list(a)           9004416 [[1, 4], 2, 3]
        a * 1             9304824 [[1, 4], 2, 3]
        copy.copy(a)      9304784 [[1, 4], 2, 3]
        copy.deepcopy(a)  9304744 [[1], 2, 3]
      '''
    

    从以上可以看出,使用 a[:], list(a), a*1, copy.copy(a)四种方式复制列表结果都可以得到一个新的列表,但是如果列表中含有列表,所有b, c, d, e四个新列表的子列表都是指引到同一个对象上。只有使用copy.deepcopy(a)方法得到的新列表f才是包括子列表在内的完全复制。

  • 深复制

    • 列表深复制:a[:]、list(list)、copy.deepcopy(a)
      上例为浅复制,如果需要深复制a指引的列表。我们必须创建新的列表,然后使用变量来指引它。可以使用切片a[:]或者list(list)来实现全复制。当使用copy.copy(a)时,如果a中嵌套有列表,则嵌套的列表是浅复制。

        a = [1, 2, 3]
      
        b = a[:]
        # b = list(a)
        # import copy
        # b = copy.deepcopy(a)
        print(id(a))  # 10652928
        print(id(b))  # 10653408  使用a[:]已成功复制
      
      
    • 其他注意事项
      还接受生成器。切片笔记法不适用于生成器,因为生成器是不可更改。因此不能generator[0]。

        >>> generator = (x * 3 for x in range(4))
        >>> list(generator)
        [0, 3, 6, 9]
      
      

      百分之九十的切片标记法都可以被list()代替。下次你看见[:]的时候试试使用list()替代,这样可以让代码更加可读。

      复制内容参照文章

个人博客:Loak 正 - 关注人工智能及互联网的个人博客
文章地址:Python基础(二)—列表和元组