【问题标题】:Python evaluating a function based on contents of a listPython 根据列表的内容评估函数
【发布时间】:2016-04-20 02:09:59
【问题描述】:

我已经继承了一个有效的代码列表:

A = [ 's1', 's2', 's3', 's1' ] #the actual size is about 200
B = [ 1, 2, 13, 4 ] #same size as A

s1、s2、s3 是动态定义的变量:

s1 = 5
s2 = 3
s3 = 13

我有一个函数定义为:

def fun1( s, arg2 ):
 return s * numpy.random.normal( 0, 1, ( 200, arg2 ) )

上述函数中的arg2来自数组B对应s1选中

我想生成这样的 C:

C = [ fun1(s1,1), fun1(s2,2), fun1(s3,13), fun1(s1,4) ] #C can be list or collection of arrays, not sure about the best data structure for C

【问题讨论】:

    标签: python list function


    【解决方案1】:

    在使用列表推导之前,使用内置函数 zip()AB 组合成一个元组列表:

    import numpy as np
    
    s1 = 5
    s2 = 3
    s3 = 13
    
    A = ['s1', 's2', 's3', 's1']
    B = [1, 2, 13, 4]
    
    def fun1(s, arg2):
     return s * np.random.normal(0, 1, (200, arg2))
    
    C = [fun1(locals()[A_item], B_item) for A_item, B_item in zip(A, B)]
    

    【讨论】:

    • 我会说izip 而不是zip,否则+1
    • 我没遇到过izip - 效率更高吗?
    • Dependsizip() 是生成器版本,所以它不会构造一个实际的列表。鉴于您将它传递给列表理解,您不需要实际的压缩列表,无论如何您最终都会丢弃它。
    • @Vlad 只是你在 python 2 中,在 python 3 中 zip 与 izip 在 2 中相同
    • @Vlad 在这种情况下也知道他们对过滤器和地图做同样的事情:)
    【解决方案2】:

    如果s1 是局部变量,则使用locals()['s1'] 访问s1 的值(给定字符串s1)。

    如果 s1s2...、s4 是全局变量,则使用 globals()

    【讨论】:

      猜你喜欢
      • 2015-12-01
      • 2014-09-14
      • 2012-08-10
      • 1970-01-01
      • 2013-01-10
      • 2020-08-24
      • 2011-09-18
      • 2016-08-14
      • 2012-07-25
      相关资源
      最近更新 更多