¿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]
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)]
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)]
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
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.product
o 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 list1
hacerlas 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)]]