¿Cómo funciona en Python verificar cada elemento de una lista (digamos l1), si está contenido en otra lista (digamos l2)?

l1 = ['a', 'b', 'c']
l2 = ['b', 'c']

La salida deseada es [False, True, True]. Así que realmente quiero un vector booleano de len(l1) y no algún tipo de intersección como ['b', 'c'] etc. Mis preguntas difieren de esta pregunta en el sentido de que no es suficiente para mi problema saber si hay algún elemento de la primera lista contenida en la segunda, pero qué elementos son y cuáles no.

-1
Qaswed 10 may. 2019 a las 14:53

6 respuestas

La mejor respuesta

Utilice una comprensión de la lista:

[x in l2 for x in l1]

Explicación:

  • Creo que se entiende mejor cuando se comienza con la parte for x in l1: se crea una variable temporal x y se enlazan todos los elementos en l1 similar a un para el bucle.
  • para cada uno de estos x ahora se verifica, si está en l2 (por lo que in en x in l2 tiene un significado diferente que el in en { {X5}}).
2
Qaswed 10 may. 2019 a las 11:53

Comprobar si un elemento está en una lista requiere operaciones O (n), si está repitiendo esto muchas veces vale la pena usar un set que tiene pruebas de membresía de (amortizado) O (1), que le da

def in1d(l1, l2):
  s2 = set(l2)
  return [x in s2 for x in l1]

(préstamo de la convención de nomenclatura de numpy )

Que será mucho más rápido cuando las listas se agranden (es decir, más de unos cientos de elementos cada una)

0
Sam Mason 10 may. 2019 a las 12:18

Si hay dos listas, l1 y l2, y tenemos que verificar si cada elemento de l1 está presente en l2, es mejor convertir l2 a un set y verifique la membresía de cada elemento de l1 en set(l2).

Las pruebas de membresía demoran O(n) en lists y O(1) en sets. El uso de un set reduciría la complejidad temporal del código requerido a O(n), que de otro modo hubiera sido O(n2).

l1 = ['a', 'b', 'c']
l2 = ['b', 'c']

# Converting to a set takes O(n) time
s2 = set(l2)  # {'c', 'b'}


# Each of the following approaches takes O(n) time

# Normal approach
contains_n = []
for x in l1:
    contains_n.append(x in s2)


# Using a list comprehension
contains_lc = [
    x in s2
    for x in l1
]


# Using a functional approach
contains_f = list(map(lambda x: x in s2, l1))


print(f'contains_n: {contains_n}')
print(f'contains_lc: {contains_lc}')
print(f'contains_f: {contains_f}')

Salida:

contains_n: [False, True, True]
contains_lc: [False, True, True]
contains_f: [False, True, True]
1
Diptangsu Goswami 10 may. 2019 a las 12:20

Puede usar numpy array, y la función {{ X1}}:

import numpy as np

l1 = ['a', 'b', 'c']
l2 = ['b', 'c']
results = numpy.in1d(l1, l2)
0
Antonin G. 10 may. 2019 a las 12:07

Esto también funciona

l1 = ['a', 'b', 'c']
l2 = ['b', 'c']

result = []
for i in l1 : 
  result.append(i in l2)

Pero es largo

0
nassim 10 may. 2019 a las 11:58

Usando lambda

l1 = ['a', 'b', 'c']
l2 = ['b', 'c']

res = list(map(lambda x: x in l2, l1))

print(res)

Salida

[False, True, True]
0
sahasrara62 10 may. 2019 a las 12:21