У меня есть список L = [a, b, c], и я хочу генерировать список кортежей:
[(a,a), (a,b), (a,c), (b,a), (b,b), (b,c)...]
Я пытался делать L * L, но он не работал. Может кто-то говорить мне, как получить это в Python.
Модуль ITERTOOLS
содержит ряд полезных функций для такого рода вещей. Похоже, вы можете искать продукты
:
>>> 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)]
Вы можете сделать это со списком понимания:
[ (x,y) for x in L for y in L]
Редактировать
Вы также можете использовать ITERTOOLS .Продукт как другие предложили, но только если вы используете 2.6 внутрь. Понимание списка будет работать будут все версии Python от 2.0. Если вы используете Itertools.product, имейте в виду, что он возвращает генератор вместо списка, поэтому вам может потребоваться преобразовать его (в зависимости от того, что вы хотите сделать с ним).
Две основные альтернативы:
>>> 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, к которой вы можете быть связаны.
x = [a, b, c] y = [] Для элемента в х: Для элемента2 в х: y.append (((товар, элемент2))
Может быть, не питон, а работа
Взгляните на модуль itertools
, который обеспечивает членство продукта
.
L =[1,2,3]
import itertools
res = list(itertools.product(L,L))
print(res)
Gives:
[(1,1),(1,2),(1,3),(2,1), .... and so on]
Хорошо, я попробовал:
l2 = [(x, y) для x в l для x в l], и это получил l квадрат.
Это лучший питонический способ сделать это? Я бы ожидал, что l * l работать в Python.
Самый старомодный способ сделать это:
def perm(L):
result = []
for i in L:
for j in L:
result.append((i,j))
return result
Это имеет время выполнения O (N ^ 2) и поэтому довольно медленно, но вы могли бы рассмотреть это «винтажный» код стиля.