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

was*_*898 3 python list

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

示例列表:

value = 'a'
a = ['a','b','c']
b = ['d','e','f']
d = ['g','h','i']
c = ['j','k','l']
Run Code Online (Sandbox Code Playgroud)

我的预期输出是找到值的列表的名称:对于上面的示例,我的预期输出将是:

一个

Hac*_*lic 7

你可以使用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']]
Run Code Online (Sandbox Code Playgroud)

获取变量名称:

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

locals()包含局部范围变量作为字典,变量名称是键,其值是值

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


Pyn*_*hia 1

鉴于您更新的问题,我们假设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)
Run Code Online (Sandbox Code Playgroud)

产生

a
Run Code Online (Sandbox Code Playgroud)

即全局命名空间中第一个列表的名称,其中包含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()
Run Code Online (Sandbox Code Playgroud)

产生

a
Run Code Online (Sandbox Code Playgroud)

注意:您可能希望采用命名约定来定位特定的变量组,例如targ_作为前缀

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)
Run Code Online (Sandbox Code Playgroud)

产生

targ_a
Run Code Online (Sandbox Code Playgroud)

为了更详细地解释一些事情,让我们看看调用globals()返回的内容。例如使用 python shell

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'}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,globals()返回一个字典。它的键是全局命名空间中定义的变量的名称。它的值是每个这样的变量所持有的值。

所以

>>> 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'
Run Code Online (Sandbox Code Playgroud)

在表达式生成的生成器上迭代一次,生成全局命名空间中的每个名称,该名称对应于名称以 开头targ_且包含等于 的元素的列表value。它通过迭代调用返回的字典来实现这一点globals