Есть ли способ исключить список в Python? - PullRequest
3 голосов
/ 08 января 2012

Я ищу способ погрузиться в список и получить прямой доступ к его элементам.Например, следующее является нормальным способом получения декартового произведения для наборов.

>>> list(itertools.product((0,1), (0,1),(0,1),(0,1)))
[(0, 0, 0, 0), (0, 0, 0, 1), (0, 0, 1, 0), (0, 0, 1, 1), (0, 1, 0, 0), (0, 1, 0, 1), (0, 1, 1, 0), (0, 1, 1, 1), (1, 0, 0, 0), (1, 0, 0, 1), (1, 0, 1, 0), (1, 0, 1, 1), (1, 1, 0, 0), (1, 1, 0, 1), (1, 1, 1, 0), (1, 1, 1, 1)]

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

>>> list(itertools.product([(0,1)]*4)

Но, конечно, это не сработает, так как функция itertools.product будет видеть его как один набор вместо четырех наборов.Итак, вопрос в том, есть ли способ сделать это:

>>> list(itertools.product(delist([(0,1)]*4))

Ответы [ 2 ]

9 голосов
/ 08 января 2012
itertools.product((0,1), repeat=4)

Функция product принимает необязательный repeat аргумент . Выше эквивалентно itertools.product((0, 1), (0, 1), (0, 1), (0, 1)).


В общем, если у вас есть список

lst = [1, 2, 4, 6, 8, ...]

и вы хотите вызвать функцию как

f(1, 2, 4, 6, 8, ...)

вы можете использовать оператор * (распаковка) , чтобы развернуть список в список аргументов:

f(*lst)
4 голосов
/ 08 января 2012

Если вы не используете itertools.product, вы также можете использовать оператор *. Оператор * делает все, что, на мой взгляд, вы подразумеваете под «делистом». Он преобразует содержимое списка или другого итерируемого объекта в позиционные аргументы для функции. В целом:

args = ['arg1', 'arg2', 'arg3', 'arg4']

# The following two calls are exactly equivalent
func('arg1', 'arg2', 'arg3', 'arg4')
func(*args)

В этом конкретном примере код будет выглядеть следующим образом:

itertools.product(*[(0,1)]*4)

Однако предыдущий ответ (от KennyTM), вероятно, более чистый в конкретном случае itertools.product:

itertools.product((0, 1), repeat=4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...