Encuentra si el valor existe en múltiples listas

Tengo 4 listas y cada elemento de la lista es único en la lista 4. ¿Cómo encuentro si el valor existe en una de las listas y devuelvo qué lista existe?

Ejemplo de lista:

value = 'a' a = ['a','b','c'] b = ['d','e','f'] d = ['g','h','i'] c = ['j','k','l'] 

Mi resultado esperado es el nombre de la lista donde se encuentra el valor: para el ejemplo anterior, mi resultado esperado sería:

una

Dada su pregunta actualizada, asummos que las variables a a, b, c, d están en el ámbito global

 value = 'a' a = ['a','b','c'] b = ['d','e','f'] d = ['g','h','i'] c = ['j','k','l'] w = next(n for n,v in filter(lambda t: isinstance(t[1],list), globals().items()) if value in v) print(w) 

produce

 a 

es decir, el nombre de la primera lista en el espacio de nombres global que contiene value

Si las variables están en un ámbito local, por ejemplo, dentro de una función, puede usar locals() lugar

 def f(): a = ['a','b','c'] b = ['d','e','f'] d = ['g','h','i'] c = ['j','k','l'] w = next(n for n,v in filter(lambda t: isinstance(t[1],list), locals().items()) if value in v) print(w) f() 

produce

 a 

Nota: es posible que desee adoptar una convención de nomenclatura para apuntar a un grupo específico de variables, por ejemplo, targ_ como prefijo

 targ_a = ['a','b','c'] targ_b = ['d','e','f'] targ_d = ['g','h','i'] targ_c = ['j','k','l'] w = next(n for n,v in filter(lambda t: isinstance(t[1],list) and t[0].startswith('targ_'), globals().items()) if value in v) print(w) 

produce

 targ_a 

Para explicar las cosas un poco más en detalle, echemos un vistazo a lo que devuelve la llamada globals() . Por ejemplo usando la shell de python

 Python 3.4.3 (default, Oct 14 2015, 20:28:29) [GCC 4.8.4] on linux Type "help", "copyright", "credits" or "license" for more information. >>> value = 'a' >>> targ_a = ['a','b','c'] >>> targ_b = ['d','e','f'] >>> targ_d = ['g','h','i'] >>> targ_c = ['j','k','l'] >>> globals() {'targ_d': ['g', 'h', 'i'], 'targ_c': ['j', 'k', 'l'], '__builtins__': , '__doc__': None, '__package__': None, '__loader__': , 'targ_a': ['a', 'b', 'c'], '__name__': '__main__', 'targ_b': ['d', 'e', 'f'], '__spec__': None, 'value': 'a'} 

Como puedes ver, globals() devuelve un diccionario. Sus claves son los nombres de las variables definidas en el espacio de nombres global. Sus valores son el valor que posee cada variable.

Por lo tanto

 >>> next(n for n,v in filter(lambda t: isinstance(t[1],list) and t[0].startswith('targ_'), globals().items()) if value in v) 'targ_a' 

itera una vez en el generador producido por la expresión, que produce cada nombre en el espacio de nombres global que corresponde a una lista cuyo nombre comienza con targ_ y que contiene un elemento igual a value . Lo hace iterando en el diccionario devuelto por la llamada a los globals

Puedes usar la list comprehension :

 >>> value ="a" >>> a = ['a','b','c'] >>> b = ['d','e','f'] >>> d = ['g','h','i'] >>> c = ['j','k','l'] >>> [x for x in a,b,c,d if value in x] [['a', 'b', 'c']] 

Para obtener el nombre de la variable:

 >>> for x in a,b,c,d: ... if value in x: ... for key,val in locals().items(): ... if x == val: ... print key ... break ... a 

locals () contiene una variable de scope local como diccionario, el nombre de la variable es clave y su valor es el valor

globals contiene una variable de scope global como diccionario, el nombre de la variable es clave y su valor es valor

Si no quieres usar una lista de comprensión, ¡siempre puedes usar una expresión lambda compleja y verbosa!

list(filter(lambda x: value in x, [a,b,c,d]))

EDITAR: La pregunta se actualizó para pedir el nombre var, no el valor var

Lo que estás tratando de hacer es casi siempre una mala idea. Supongamos que obtiene una cadena que contiene el nombre de la lista que desea. ¿Qué haces con eso entonces? No hay una buena forma de obtener una variable si todo lo que tienes es una cadena que contiene su nombre. Puede hacerlo con globals() o locals() , pero eso inevitablemente hace que su código sea desordenado y confuso.

La forma correcta de hacerlo es usar una lista o un diccionario para recostackr todas las listas que desea buscar. Iterar a través de un solo objeto es una práctica mucho mejor que iterar a través de cada nombre en el ámbito global o local.

 value = "a" named_lists = { "a": ['a','b','c'], "b": ['d','e','f'], "d": ['g','h','i'], "c": ['j','k','l'] } names = [name for name, seq in named_lists.items() if value in seq] print(names) if names: #there may be multiple lists that contain `value`, so let's just look at the first one, if it exists first_name = names[0] print(named_lists[first_name]) 

Resultado:

 ['a'] ['a', 'b', 'c']