Как отобразить кортеж данных в кортеж функций? - PullRequest
2 голосов
/ 03 октября 2010

У меня есть следующий код Python:

data  = ['1', '4.6', 'txt']
funcs = [int, float, str]

Как вызвать каждую функцию с данными в соответствующем индексе в качестве аргумента функции?Теперь я использую код:

result = []
for i, func in enumerate(funcs):
    result.append(func(data[i]))

map (funcs, data) не работает с набором функций (есть встроенная функция, которая делает это проще?

Ответы [ 5 ]

8 голосов
/ 03 октября 2010

Вы можете использовать zip* для объединения многих последовательностей:

zip([a,b,c,...], [x,y,z,...]) == [(a,x), (b,y), (c,z), ...]

, затем вы можете выполнить итерацию этой новой последовательности и заставить каждую функцию применяться к соответствующим данным.Поскольку вы просто хотите собрать их в список, понимание списка намного лучше, чем цикл for:

result = [f(x) for f, x in zip(funcs, data)]

Примечание: * Используйте itertools.izip если вы используете Python 2.x и списки очень длинные.)

2 голосов
/ 03 октября 2010

map() будет работать с последовательностями функций, хотя, возможно, не так, как вы думали:

data  = ['1', '4.6', 'txt']
funcs = [int, float, str]

result = map(lambda f,d: f(d), funcs, data)
# or
result = map(lambda d,f: f(d), data, funcs)
2 голосов
/ 03 октября 2010
>>> data  = ['1', '4.6', 'txt']
>>> funcs = [int, float, str]
>>> result = [funcs[pos](x) for pos, x in enumerate(data)]
>>> result
[1, 4.5999999999999996, 'txt']
>>> 
2 голосов
/ 03 октября 2010

[f(d) for d,f in zip(data, funcs)]

0 голосов
/ 03 октября 2010

Если вам нужны значения одно за другим, вы также можете создать генератор значений:

def my_funcvals(funcs,vals):
    return ("%s(%r) = %r" %(f.__name__,d, f(d)) for d,f in zip(data, funcs))

data  = ['1', '4.6', 'txt']
funcs = [int, float, str]

for result in my_funcvals(funcs, data):
    print result
...