Умножение списка - PullRequest
       16

Умножение списка

5 голосов
/ 31 января 2010

У меня есть список L = [a, b, c], и я хочу создать список кортежей:

[(a,a), (a,b), (a,c), (b,a), (b,b), (b,c)...] 

Я пытался сделать L * L, но это не сработало. Может кто-нибудь сказать мне, как получить это в Python.

Ответы [ 7 ]

22 голосов
/ 31 января 2010

Вы можете сделать это с пониманием списка:

[ (x,y) for x in L for y in L]

редактировать

Вы также можете использовать itertools.product, как предлагали другие, но только если вы используете 2.6 и более поздние версии. Понимание списка будет работать на всех версиях Python от 2.0. Если вы используете itertools.product, имейте в виду, что он возвращает генератор вместо списка, поэтому вам может потребоваться преобразовать его (в зависимости от того, что вы хотите с ним делать).

13 голосов
/ 31 января 2010

Модуль itertools содержит ряд полезных функций для такого рода вещей. Похоже, вы ищете product:

>>> import itertools
>>> L = [1,2,3]
>>> itertools.product(L,L)
<itertools.product object at 0x83788>
>>> list(_)
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
7 голосов
/ 31 января 2010

Взгляните на модуль itertools, который обеспечивает член product.

L =[1,2,3]

import itertools
res = list(itertools.product(L,L))
print(res)

Дает:

[(1,1),(1,2),(1,3),(2,1), ....  and so on]
3 голосов
/ 31 января 2010

Две основные альтернативы:

>>> L = ['a', 'b', 'c']
>>> import itertools
>>> list(itertools.product(L, L))
[('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'b'), ('b', 'c'), ('c', 'a'), ('c', 'b'), ('c', 'c')]
>>> [(one, two) for one in L for two in L]
[('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'b'), ('b', 'c'), ('c', 'a'), ('c', 'b'), ('c', 'c')]
>>> 

первая требует Python 2.6 или выше - последняя работает практически с любой версией Python, к которой вы можете быть привязаны.

0 голосов
/ 31 января 2010

Самый старомодный способ сделать это будет:

def perm(L):
    result = []
    for i in L:
        for j in L:
            result.append((i,j))
    return result

Это время выполнения O (n ^ 2) и, следовательно, довольно медленное, но вы можете считать его кодом "винтажного" стиля.

0 голосов
/ 31 января 2010

Хорошо, я попробовал:

L2 = [(x, y) для x в L для x в L], и это получило квадрат L.

Это лучший питонский способ сделать это? Я ожидаю, что L * L будет работать в Python.

0 голосов
/ 31 января 2010

х = [а, б, в] у = [] для элемента в х: для item2 в x: y.append ((item, item2))

Может быть, не Pythonic, но работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...