Soru Python'da çift yönlü çapraz ürün [duplicate]


Bu sorunun zaten bir cevabı var:

Çapraz ürün listesini nasıl alabilirim çiftleri Python'da keyfi uzun listeler listesinden mi?

Örnek

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

crossproduct(a,b) vermelidir [[1, 4], [1, 5], [1, 6], ...].


76
2018-03-29 21:27


Menşei


Kartezyen ürün denir. - jfs
çapraz ürün olarak da bilinir en.wikipedia.org/wiki/Cross_product_(disambiguation) - sam boosalis


Cevaplar:


Arıyorsun itertools.product eğer (en azından) Python 2.6 ise.

>>> 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



2.6 öncesi kullanım için, salt Python uygulamasının bağlı belgelerden kopyalayıp yapıştırabileceğini unutmayın. - Mike Graham
product() iki parametreyle sınırlı değildir, bu nedenle de keyfi listelerin bir listesi (kendileri de listelenmiştir) için kullanılabilir. Yani yapabilirsin list(itertools.product(*[[1,2],[3,4],[5,6]])) almak [(1, 3, 5), (1, 3, 6),.. - valid


Bir liste istediğin için:

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

Ancak, bunun yerine jeneratörler kullanarak bunlardan geçiyorsanız bir listenin genel giderlerinden kaçınabilirsiniz:

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

Aynı şekilde davranır for döngü ama bir oluşturulmasına neden olmaz list.


74
2018-03-29 21:30



Bu yöntemi tercih ederim ama nedenini söyleyemem. Belki de çift döngü açık mı? - Rich
Güzel pythonic. Ya da söylemek istediğim gibi, pitofifesiteye iyi bir örnek. - charleslparker
Teşekkürler! Ne yaptığına benzeyen büyük bir kod hayranıyım. - Cory Petosky
Tam olarak ne demek istediğinden emin değilim. Eğer a ve b kümeler değildir ve kendi içinde yinelenen öğeler vardır, o zaman evet, bu yinelenen girişler üretebilir. [(x, y) for x in [1, 1] for y in [2]] üretecek [(1, 2), (1, 2)]. Ancak bu, set dışı girdilerdeki setlerde tanımlanan bir matematiksel işlemin uygulanmasının sonucudur. Ters çiftler oluşmaz - a yinelenen, o öğe de olmadığı sürece, iade edilen bir çiftin ikinci öğesi olarak asla görünmeyecektir b iterable. - Cory Petosky
Açık, her zaman örtük olmaktan iyidir. - ozgur


Jeneratörler kullanarak sadece itertools'a gerek yoktur.

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