Python: ¿cómo hacer que se tomen dos listas y se eliminen elementos basados ​​en otra lista?

CorePress2024-01-25  8

Tengo tres listas. Dos listas de cadenas y una lista de flotadores. Utilicé zip para hacer coincidir una lista de cadenas y flotar juntas que tienen la misma longitud para crear una nueva cadena. Básicamente:

letters1 = ['a', 'b', 'c', 'd', 'e']
numbers = [0.0, 3.0, 5.0, 10.0, 28.0]
letters2 = ['a', 'c', 'e']
letnum = [i for i in zip(letters1, numbers)]

Esto me entiende: [('a', 0.0), ('b', 3.0), ('c', 5.0), ('d', 10.0), ('e', 28.0)]

Quiero usar la otra lista para obtener solo [0.0, 5.0, 28.0], pero no sé cómo devolver una lista flotante como esa.

Intenté usar [x para x en letnum si x en letras2] pero eso me dio [].

También sé que letnum = [i para _, i en zip(letras1, números)] me dará [0.0, 3.0, 5.0, 10.0, 28.0] pero no sé si eso hace algo.

¡Cualquier ayuda será apreciada!



------------------------------------

Cada elemento en letnum es una tupla que es un par de una letra y un flotante. Si tomas el primer elemento de la tupla y luego verificas su existencia en la lista de letras2, encontrarás una coincidencia.

[x for x in letnum if x[0] in letters2] 

x[0] está tomando el primer elemento de la tupla.



------------------------------------

¿Podrías intentar lo siguiente?

letters1 = ['a', 'b', 'c', 'd', 'e']
numbers = [0.0, 3.0, 5.0, 10.0, 28.0]
letters2 = ['a', 'c', 'e']

d = {}
for i in range(len(letters1)):
    d[letters1[i]] = numbers[i]
letnum = [d[x] for x in letters2]
print(letnum)

Salida:

[0.0, 5.0, 28.0]

1

@RavinderSingh13 gracias por señalarme el hilo. Es una discusión difícil llegar a una conclusión. Supongo que la restricción de las eliminaciones/recuperaciones es una idea. Por cierto, los chicos enumerados no son los únicos que eliminan preguntas en exceso, como sabes.

-tshiono

1 de abril de 2021 a las 12:41



------------------------------------

Consideremos todo el proceso de una vez (editado ligeramente porque no entendí bien el requisito)

para cada uno de los pares de letras y números que obtenemos al comprimir letras1 y números, queremos: el número, bPero solo si la letra estaba en letras2.

Entonces, lo escribimos exactamente así, excepto que la descripción del elemento va al frente.

[number for letter, number in zip(letters1, numbers) if letter in letter2]

Para cubrir tus intentos:

Intenté usar [x para x en letnum si x en letras2] pero eso me dio [].

Sí, porque x es uno de los pares y letras2 no contiene esos pares. Puede solucionar esto como en la respuesta de @vaichidrewar extrayendo la letra, x[0], para la comparación. De manera similar, x es uno de los pares y solo quieres el número, por lo que x[1] extrae el número.

También sé que letnum = [i para _, i en zip(letras1, números)] me dará [0.0, 3.0, 5.0, 10.0, 28.0] pero no sé si eso hace algo.

Es un comienzo, en el sentido de que estás usando el descomprimido de los resultados zip para dar nombres separados al elemento.nts de cada par que obtengas. Por convención, usamos _ para referirnos a valores que no nos importan; pero sí te importan ambos valores (porque quieres la letra de la condición).



------------------------------------

Si anticipa listas grandes, aquí tiene una solución lineal que utiliza un diccionario de búsqueda para permitir tomar un flotante para cada elemento en letras2 en tiempo constante en lugar de iterar repetidamente en un bucle anidado. La complejidad del tiempo total es O(len(letras) + len(letras2)), que es óptima:

>>> letters1 = ['a', 'b', 'c', 'd', 'e']
>>> numbers = [0.0, 3.0, 5.0, 10.0, 28.0]
>>> letters2 = ['a', 'c', 'e']
>>> lookup = {x: y for x, y in zip(letters1, numbers)}
>>> [lookup[x] for x in letters2 if x in lookup]
[0.0, 5.0, 28.0]

La razón por la que su intento original no funciona es que [x for x in letnum if x in cards2] intenta encontrar unaTupla completa x en letras2 que solo contiene cadenas.



------------------------------------

convierta el objeto zip en una lista y acceda al índice 0, 2, 5 usando range(0, len(numbers), 2)

letters1 = ['a', 'b', 'c', 'd', 'e']
numbers = [0.0, 3.0, 5.0, 10.0, 28.0]
letters2 = ['a', 'c', 'e']
letnum = [list(zip(letters1, numbers))[i] for i in range(0,len(numbers), 2)]

print(letnum)

Método-2

letnum = [i for i in zip(letters1, numbers) if i[0] in letters2]

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare