Вложены для циклов в Python по сравнению с функцией карты - PullRequest
4 голосов
/ 07 сентября 2011

Я работаю в Python и в настоящее время имею следующий код:

list = []
for a in range(100):
    for b in range(100):
        for c in range(100):
            list.append(run(a,b,c))

где run (a, b, c) возвращает целое число (например, оно может умножить три числа вместе). Есть ли более быстрый способ зацикливания этих чисел или использования функции карты?

Спасибо:)

Ответы [ 5 ]

8 голосов
/ 07 сентября 2011

Посмотрите на модуль itertools и, в частности, метод продукта

пример использования:

for i in itertools.product(range(0,100), repeat=3):
    #do stuff with i
    list.append(run(i[0],i[1],i[2]))

Обратите внимание, что вызов функции может быть сокращен до:

list.append(run(*i))

в приведенном выше примере. см. docs.python.org для объяснения распаковки списков аргументов.

Например, вывод product(range(0,2), repeat=3)) выглядит следующим образом:

(0, 0, 0)
(0, 0, 1)
(0, 1, 0)
(0, 1, 1)
(1, 0, 0)
(1, 0, 1)
(1, 1, 0)
(1, 1, 1)
2 голосов
/ 07 сентября 2011

Я думаю, что вы можете использовать imap для этого:

from itertools import imap
result = list(imap(run, range(100), range(100), range(100)))

imap выдает свой результат ... поэтому, если вы хотите перебрать результаты, не используйте list ()

1 голос
/ 07 сентября 2011
from itertools import product
my_list = [run(a, b, c) for a, b, c in product(xrange(100), xrange(100), xrange(100))]

Или:

from itertools import product
my_list = [run(a, b, c) for a, b, c in product(xrange(100), repeat=3)]
0 голосов
/ 07 сентября 2011

альтернатива, в зависимости от того, что именно вы хотите сделать:

my_array = numpy.tile(numpy.arange(100),(3,1)).T
def run(row):
    return numpy.prod(row, 0)
[run(row) for row in my_array]

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

my_product = run(my_array.T)
my_product = numpy.prod(my_array, 1)
0 голосов
/ 07 сентября 2011
import itertools    
li = [run(*triple) for triple in itertools.product(xrange(100), repeat=3)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...