¿Cómo puedo hacer coincidir permutaciones de una lista larga con una lista más corta (según la longitud de la lista más corta)? [duplicar]

Resuelto user1735075 asked hace 12 años • 11 respuestas

Tengo problemas para entender un algoritmo que intento implementar. Tengo dos listas y quiero tomar combinaciones particulares de las dos listas.

He aquí un ejemplo.

names = ['a', 'b']
numbers = [1, 2]

la salida en este caso sería:

[('a', 1), ('b', 2)]
[('b', 1), ('a', 2)]

Puede que tenga más nombres que números, es decir len(names) >= len(numbers). Aquí hay un ejemplo con 3 nombres y 2 números:

names = ['a', 'b', 'c']
numbers = [1, 2]

producción:

[('a', 1), ('b', 2)]
[('b', 1), ('a', 2)]
[('a', 1), ('c', 2)]
[('c', 1), ('a', 2)]
[('b', 1), ('c', 2)]
[('c', 1), ('b', 2)]
user1735075 avatar Oct 17 '12 20:10 user1735075
Aceptado

La forma más sencilla es utilizar itertools.product:

a = ["foo", "melon"]
b = [True, False]
c = list(itertools.product(a, b))
>> [("foo", True), ("foo", False), ("melon", True), ("melon", False)]
DrIDK avatar Dec 01 '2015 23:12 DrIDK

Puede ser más simple que el más simple anterior:

>>> a = ["foo", "bar"]
>>> b = [1, 2, 3]
>>> [(x,y) for x in a for y in b]  # for a list
[('foo', 1), ('foo', 2), ('foo', 3), ('bar', 1), ('bar', 2), ('bar', 3)]
>>> ((x,y) for x in a for y in b)  # for a generator if you worry about memory or time complexity.
<generator object <genexpr> at 0x1048de850>

sin ninguna importación

logic avatar Aug 21 '2016 13:08 logic

Nota : esta respuesta es para la pregunta específica formulada anteriormente. Si está aquí desde Google y solo busca una manera de obtener un producto cartesiano en Python, itertools.producto una simple lista de comprensión puede ser lo que está buscando, consulte las otras respuestas.


Suponer len(list1) >= len(list2). Entonces lo que parece querer es tomar todas las permutaciones de longitud len(list2)y list1hacerlas coincidir con los elementos de la lista2. En pitón:

import itertools
list1=['a','b','c']
list2=[1,2]

[list(zip(x,list2)) for x in itertools.permutations(list1,len(list2))]

Devoluciones

[[('a', 1), ('b', 2)], [('a', 1), ('c', 2)], [('b', 1), ('a', 2)], [('b', 1), ('c', 2)], [('c', 1), ('a', 2)], [('c', 1), ('b', 2)]]
interjay avatar Oct 17 '2012 13:10 interjay