zoukankan      html  css  js  c++  java
  • python 的内置方法zip()介绍

    转载至:https://blog.csdn.net/eric_sunah/article/details/20551087

    定义:zip([iterable, ...])
    zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。利用*号操作符,可以将list unzip(解压),看下面的例子就明白了:

    1.  
      >>> a = [1,2,3]
    2.  
      >>> b = [4,5,6]
    3.  
      >>> c = [4,5,6,7,8]
    4.  
      >>> zipped = zip(a,b)
    5.  
      [(1, 4), (2, 5), (3, 6)]
    6.  
      >>> zip(a,c)
    7.  
      [(1, 4), (2, 5), (3, 6)]
    8.  
      >>> zip(*zipped)
    9.  
      [(1, 2, 3), (4, 5, 6)]

    对于这个并不是很常用函数,下面举几个例子说明它的用法:

    * 二维矩阵变换(矩阵的行列互换)

    比如我们有一个由列表描述的二维矩阵
    a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    通过python列表推导的方法,我们也能轻易完成这个任务

    1.  
      print [ [row[col] for row in a] for col in range(len(a[0]))]
    2.  
      [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

    另外一种让人困惑的方法就是利用zip函数:

    1.  
      >>> a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    2.  
      >>> zip(*a)
    3.  
      [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
    4.  
      >>> map(list,zip(*a))
    5.  
      [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

    这种方法速度更快但也更难以理解,将list看成tuple解压,恰好得到我们“行列互换”的效果,再通过对每个元素应用list()函数,将tuple转换为list

    * 以指定概率获取元素

    1.  
      >>> import random
    2.  
      >>> def random_pick(seq,probabilities):
    3.  
      x = random.uniform(0, 1)
    4.  
      cumulative_probability = 0.0
    5.  
      for item, item_probability in zip(seq, probabilities):
    6.  
      cumulative_probability += item_probability
    7.  
      if x < cumulative_probability: break
    8.  
      return item
    9.  
       
    10.  
      >>> for i in range(15):
    11.  
      random_pick("abc",[0.1,0.3,0.6])
    12.  
       
    13.  
      'c'
    14.  
      'b'
    15.  
      'c'
    16.  
      'c'
    17.  
      'a'
    18.  
      'b'
    19.  
      'c'
    20.  
      'c'
    21.  
      'c'
    22.  
      'a'
    23.  
      'b'
    24.  
      'b'
    25.  
      'c'
    26.  
      'a'
    27.  
      'c'

    这个函数有个限制,指定概率的列表必须和元素一一对应,而且和为1,否则这个函数可能不能像预想的那样工作。
    稍微解释下,先利用random.uniform()函数生成一个0-1之间的随机数并复制给x,利用zip()函数将元素和他对应的概率打包成tuple,然后将每个元素的概率进行叠加,直到和大于x终止循环
    这样,”a”被选中的概率就是x取值位于0-0.1的概率,同理”b”为0.1-0.4,”c”为0.4-1.0,假设x是在0-1之间平均取值的,显然我们的目的已经达到

  • 相关阅读:
    【19】什么时候该改变开发集和评估指标
    【18】训练/开发/测试集划分
    【17】满足和优化指标
    【16】机器学习中的单一评估指标
    【15】ML项目流程与正交化
    【14】Softmax回归
    【13】正则化网络激活函数(Batch归一化)
    【12】超参数及超参数的选择
    【11】神经网络的优化算法
    06-----Nodejs介绍
  • 原文地址:https://www.cnblogs.com/confessionlouis/p/9235973.html
Copyright © 2011-2022 走看看