Pytanie Parowóz crossproduct w języku Python [duplicate]


To pytanie już zawiera odpowiedź:

Jak mogę uzyskać listę produktów krzyżowych? pary z listy dowolnie długich list w Pythonie?

Przykład

a = [1, 2, 3]
b = [4, 5, 6]

crossproduct(a,b) powinien dać [[1, 4], [1, 5], [1, 6], ...].


76
2018-03-29 21:27


pochodzenie


Nazywa się to produktem kartezjańskim. - jfs
znany również jako produkt krzyżowy en.wikipedia.org/wiki/Cross_product_(disambiguation) - sam boosalis


Odpowiedzi:


Szukasz itertools.product jeśli jesteś na (przynajmniej) Pythonie 2.6.

>>> import itertools
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> itertools.product(a,b)
<itertools.product object at 0x10049b870>
>>> list(itertools.product(a,b))
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]

113
2018-03-29 21:29



Zauważ, że w przypadku wersji przed 2.6 możesz po prostu skopiować i wkleić czystą implementację Pythona z połączonej dokumentacji. - Mike Graham
product() nie ogranicza się do dwóch parametrów, dzięki czemu można je wykorzystać również dla dowolnej liczby list (wymienionych na liście). Więc możesz to zrobić list(itertools.product(*[[1,2],[3,4],[5,6]])) dostać [(1, 3, 5), (1, 3, 6),.. - valid


Ponieważ poprosiłeś o listę:

[(x, y) for x in a for y in b]

Ale możesz uniknąć narzutów listy, jeśli po prostu przeglądasz je, używając generatorów:

((x, y) for x in a for y in b)

Zachowuje się identycznie w for loop, ale nie powoduje utworzenia a list.


74
2018-03-29 21:30



Wolę tę metodę, ale nie mogę powiedzieć dlaczego. Może dlatego, że podwójna pętla jest jawna? - Rich
Ładnie pythonic. Lub jak lubię powiedzieć, dobry przykład pythontificocity. - charleslparker
Dzięki! Jestem wielkim fanem kodu, który wygląda jak to, co robi. - Cory Petosky
Nie jestem do końca pewien, co masz na myśli. Gdyby a i b nie są zestawami i mają zduplikowane elementy wewnątrz siebie, to tak, może to powodować duplikowanie wpisów. [(x, y) for x in [1, 1] for y in [2]] produkuje [(1, 2), (1, 2)]. Jest to jednak wynik zastosowania operacji matematycznej zdefiniowanej w zestawach na nie ustawionym wejściu. Odwrócone pary nie wystąpią - cokolwiek w a iterable nigdy nie pojawi się jako drugi element zwróconej pary, chyba że ten element również znajduje się w b iterable. - Cory Petosky
Jawny jest zawsze lepszy niż niejawny. - ozgur


Korzystanie z generatorów nie wymaga użycia narzędzi, po prostu:

gen = ((x, y) for x in a for y in b)

for u, v in gen:
    print u, v

12
2017-11-07 09:39