2016-04-30 4 views
1

Мне нужно перебирать два списка чисел, которые образуют входные данные для функции. Я бы хотел сделать это функционально. В настоящее время я делаю:Итерация по параметрам без цикла

results = [] 
for i in params_list1: 
    for j in params_list2: 
     results.append(myfunction(i,j)) 

где myfunction() возвращает число. Я уверен, что есть способ умножить params_list1 и params_list2 (возможно, используя numpy broadcasting?) И сопоставить их с myfunction(), но я не могу понять это. Какие-нибудь советы?

+2

Не могли бы вы опубликовать пример _input_ и _output_ наборы данных (5-7 строк в CSV/Dict/JSON/Python код формата __as text__, так можно использовать его при кодировании) и описать, что вы хотите делать с входными данными, чтобы получить выходной набор данных? [Как создать минимальный, завершенный и проверяемый пример] (http://stackoverflow.com/help/mcve) – MaxU

+0

Я думаю, что OP просит о способах получения и перебора декартовых произведений. – Quirk

+0

@MaxU Я думаю, что * mcve * находится в вопросе – styvane

ответ

4

Вы можете использовать itertools.product, чтобы сделать это, и вы должны рассмотреть возможность использования списковых или map (если вам нужно ленивые вычисления) вместо использования с помощью list.append:

results = [] 
for i, j in itertools.product(params_list1, params_list2): 
    results.append(myfunction(i, j)) 

или используя map вроде этого:

result = map(function(i, j) for i, j in itertools.product(params_list1, params_list2)) 

Вы можете также использовать выражение * в Python3.x распаковать список аргументов:

result = [myfunction(*item) for item in itertools.product(params_list1, params_list2)] 
+0

ahh itertools.product. Я думал о бесчисленном вещании, но это работает! – ilanman

+0

@ilanman рад помочь! – styvane

+0

Аргумент распаковки ('f (* args, ** kwargs)') также работает в Python 2.x –

-3

map(myfunction, params_list1,params_list2)

+2

Это просто эквивалентно 'zip()' или хуже. OP нуждается в декартовых произведениях. – Quirk

+0

Я неправильно понял вопрос. В приложении «Стек» нет опции удаления. –

1

NumPy решение:

import numpy as np 

In [261]: a = np.array([0,1,2,3]) 

In [262]: b = np.array([2,3,4]) 

In [263]: 

In [263]: np.dstack(np.meshgrid(a, b)).reshape(-1, 2) 
Out[263]: 
array([[0, 2], 
     [1, 2], 
     [2, 2], 
     [3, 2], 
     [0, 3], 
     [1, 3], 
     [2, 3], 
     [3, 3], 
     [0, 4], 
     [1, 4], 
     [2, 4], 
     [3, 4]]) 
Смежные вопросы