2016-01-14 4 views
2

У меня есть 4 списка, и каждый элемент в списке уникален в списке 4. Как найти, существует ли значение в одном из списка и возвращать его список?Найти, если значение существует в нескольких списках

Пример списка:

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

Мой ожидается выход название списка, где находится значение: Для примера выше моего ожидаемого результата будет:

+0

какие значения находятся в списке, они другие списки или строковые значения в списках или цифр ... –

+9

'[я для я в [а, Ь, с , d] если значение в i] ' –

+0

Вы хотите, чтобы переменная, содержащая список, была возвращена или содержимое списка (ов), где они были найдены? т. е. каков ваш ожидаемый результат? –

ответ

2

Учитывая Ваш обновленный вопрос, давайте предположим, что 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 

ie имя первого списка в глобальном пространстве имен, которое содержит 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 

Примечание: Вы можете принять именовании для нацеливания на определенную группу переменных, например 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) 

производит

targ_a 

Чтобы объяснить вещи немного более подробно, давайте посмотрим на то, что globals() возвращается вызова.Например с помощью питона оболочки

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'} 

, как вы можете видеть, 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' 

итерацию один раз на генераторе, полученного с помощью выражения, которое дает каждое имя в глобальном пространстве имен, который соответствует списку, название которого начинается с targ_ и содержит элемент, равный value. Он делает это путем итерации по словарю, возвращаемому вызовом globals

+0

Благодарим вас за предоставленные вами различные решения. Почему вы не назвали имена списков? @Pynchia – essramos

+0

см. Мое добавленное изменение для более подробной информации :) – Pynchia

+1

Спасибо, теперь я понимаю @Pynchia – essramos

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']] 

К g и др имя переменное:

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

местные() содержит локальный переменный объем, как словарь, имя переменного являетесь ключевыми и его значением является значение

глобал содержит глобальный переменный объем, как словарь, имя переменного является ключ и его значение является значением

3

Если вы не хотите использовать список понимание, вы всегда можете использовать запутанные и подробное выражение лямбда!

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

EDIT: Вопрос был обновлен, чтобы спросить имя вар, не вар значения

2

То, что вы пытаетесь сделать, - это почти всегда плохая идея. Предположим, вы получите строку, содержащую имя нужного вам списка. Что ты там делаешь? Нет никакого хорошего способа получить переменную, если у вас есть строка, содержащая ее имя. Вы можете сделать это с 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']