superponer - ¿Cómo verificar si todos los siguientes elementos están en una lista?
superponer graficas en r (4)
¿Qué pasa si sus listas contienen duplicados como este:
v1 = [''s'', ''h'', ''e'', ''e'', ''p'']
v2 = [''s'', ''s'', ''h'']
Los conjuntos no contienen duplicados. Por lo tanto, la siguiente línea devuelve True.
set(v2).issubset(v1)
Para contar los duplicados, puede utilizar el código:
v1 = sorted(v1)
v2 = sorted(v2)
def is_subseq(v2, v1):
"""Check whether v2 is a subsequence of v1."""
it = iter(v1)
return all(c in it for c in v2)
Entonces, la siguiente línea devuelve False.
is_subseq(v2, v1)
Descubrí que hay una pregunta relacionada sobre cómo encontrar si al menos un elemento existe en una lista:
¿Cómo verificar si uno de los siguientes elementos está en una lista?
Pero, ¿cuál es la mejor manera de encontrar si todos los elementos existen en una lista?
Buscando en los documentos encontré esta solución:
>>> l = [''a'', ''b'', ''c'']
>>> set([''a'', ''b'']) <= set(l)
True
>>> set([''a'', ''x'']) <= set(l)
False
Otra solución sería esta:
>>> l = [''a'', ''b'', ''c'']
>>> all(x in l for x in [''a'', ''b''])
True
>>> all(x in l for x in [''a'', ''x''])
False
Pero aquí debes hacer más mecanografía.
¿Hay alguna otra solución?
Los operadores como <=
en Python generalmente no son anulados para significar algo significativamente diferente que "menor o igual que". Es inusual que la biblioteca estándar haga esto: me huele a API heredada.
Utilice el método equivalente y más claro, set.issubset
. Tenga en cuenta que no es necesario convertir el argumento en un conjunto; Hará eso por ti si es necesario.
set([''a'', ''b'']).issubset([''a'', ''b'', ''c''])
Me gustan estos dos porque parecen los más lógicos, siendo este último más corto y probablemente más rápido (se muestra aquí usando la sintaxis literal set
que ha sido backported a Python 2.7):
all(x in {''a'', ''b'', ''c''} for x in [''a'', ''b''])
# or
{''a'', ''b''}.issubset({''a'', ''b'', ''c''})
Probablemente usaría set
de la siguiente manera:
set(l).issuperset(set([''a'',''b'']))
O de otra forma :
set([''a'',''b'']).issubset(set(l))
Lo encuentro un poco más legible, pero puede ser una matanza excesiva. Los conjuntos son particularmente útiles para calcular la unión / intersección / diferencias entre colecciones, pero puede que no sea la mejor opción en esta situación ...