2016-01-14 1 views
2

Я grandfathered код, который работает имеет список:Python оценки функцию, основанную на содержании списка

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)) 

арг2 в вышеупомянутой функции происходит из массива 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 

ответ

3

Используйте встроенную функцию zip() объединить A и B в список кортежей, прежде чем использовать список понимание:

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)] 
+0

Я бы сказал 'izip' вместо' zip', иначе +1 – Vlad

+0

Я не сталкивался с 'izip' - это более эффективно? – gtlambert

+1

[Зависит] (http://stackoverflow.com/questions/4989763/when-is-it-better-to-use-zip-instead-of-izip). 'izip()' является версией генератора, поэтому он не будет создавать фактический список. Учитывая, что вы передаете его в список, вам не нужен фактический список в виде zip-файлов, вы все равно откажетесь от него. – Vlad

2

Используйте locals()['s1'] для доступа к значению s1 с заданной строкой s1, если s1 является локальной переменной.

Использовать globals(), если s1, s2 ..., s4 являются глобальными переменными.