Python 查找值是否存在于多个列表中

Python 查找值是否存在于多个列表中,python,list,Python,List,我有4个列表,列表中的每个元素在4个列表中都是唯一的。如何查找某个列表中是否存在该值,并返回该值存在的列表 示例列表: value = 'a' a = ['a','b','c'] b = ['d','e','f'] d = ['g','h','i'] c = ['j','k','l'] 我的预期输出是找到值的列表的名称: 对于上述示例,我的预期输出为: a您可以使用列表理解: >>> value ="a" >>> a = ['a','b','c'] >

我有4个列表,列表中的每个元素在4个列表中都是唯一的。如何查找某个列表中是否存在该值,并返回该值存在的列表

示例列表:

value = 'a'
a = ['a','b','c']
b = ['d','e','f']
d = ['g','h','i']
c = ['j','k','l']
我的预期输出是找到值的列表的名称: 对于上述示例,我的预期输出为:


a

您可以使用
列表理解

>>> 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']]
要获取变量名,请执行以下操作:

>>> 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()包含作为字典的局部作用域变量,变量名为key,值为value

globals包含全局范围变量作为字典,变量名为key,值为value


如果您不想使用列表理解,您可以始终使用复杂而详细的lambda表达式

列表(过滤器(λx:x中的值,[a,b,c,d]))


编辑:问题更新为询问var名称,而不是var值

鉴于您更新的问题,让我们假设
a、b、c、d
变量在全局范围内

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)
产生

a
a
targ_a
i、 e.全局命名空间中包含
value

如果变量在局部范围内,例如在函数内,则可以使用
locals()

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()
产生

a
a
targ_a
注意:您可能希望采用命名约定以一组特定的变量为目标,例如,
target\uu
作为前缀

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)
产生

a
a
targ_a
为了更详细地解释,让我们看看
globals()
调用返回的内容。例如,使用pythonshell

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__': <module 'builtins' (built-in)>,
 '__doc__': None, '__package__': None,
 '__loader__': <class '_frozen_importlib.BuiltinImporter'>,
 'targ_a': ['a', 'b', 'c'], '__name__': '__main__',
 'targ_b': ['d', 'e', 'f'], '__spec__': None, 'value': 'a'}

在表达式生成的生成器上迭代一次,这将生成全局命名空间中的每个名称,该名称对应于名称以
targ
开头且包含一个等于
value
的元素的列表。它通过对调用globals返回的字典进行迭代来实现这一点。您试图做的几乎总是一个坏主意。假设您得到一个包含所需列表名称的字符串。那你用它做什么?如果您只有一个包含变量名称的字符串,那么就没有很好的方法来获取变量。您可以使用
globals()
locals()
,但这些不可避免地会使您的代码混乱不堪

正确的方法是使用列表或词典收集所有要搜索的列表。迭代单个对象比迭代全局或局部范围内的每个名称要好得多

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])
结果:

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

列表中有哪些值,它们是列表中的其他列表或字符串值还是数字…
[i for i in[a,b,c,d]如果值in i]
是否要返回保存列表的变量或列表中找到它们的内容?i、 e.您的预期结果是什么?编辑了问题@Martinevanst感谢您提供的不同解决方案。你为什么不叫名单上的名字@Pynchia谢谢你,我现在明白了@Pynchia这个答案给了OP他们想要的,我不能因此而责备它。但警告未来的读者:使用
globals()
locals()
几乎总是一个坏主意。如果你想得到一个包含变量名的字符串,这是一个强烈的迹象,表明你的代码有一个设计问题,你应该考虑重构,这样你就不再需要这么做了。