2016-03-22 2 views
1
a = {'name1':'tom'} 
b = {'name2':'harry'} 
c = {'name3':'peter'} 

Для данного ключа я хотел бы, чтобы имя словаря содержало его.
Пример: Если я дать «name2», я хотел бы получить б в результате
БлагодаряПолучите имя словаря, который содержит заданный ключ в python

+2

Можете ли вы показать что вы пробовали? Например, нет ничего, что мешает вам делать диктофон? – EdChum

+2

Вы хотите получить 'b' как переменную или' 'b" 'как строку? – linusg

+0

Зачем вам нужно имя переменной (или ссылка на переменную)? –

ответ

4

Вы можете использовать next вернуть следующее значение в последовательности, и фильтровать его на основе некоторых критериев:

key = 'name2' 
found = next(d for d in (a, b, c) 
      if key in d) 
+1

Этот ответ был для меня просветлен ... При этом 'next' поддерживает результат по умолчанию через необязательный аргумент, который imo в этот случай может быть использован плодотворно: 'found = next ((d для d in (a, b, c), если ключ в d), None)', за которым следует условный блок 'if found: ...' – gboffi

+0

OP doesn «Я говорю, что они хотят делать, если ключ не существует. Часто [проще просить прощения, чем разрешение] (https://docs.python.org/2/glossary.html#term-eafp). –

0

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

{"name1" : a, "name2" : b, "name3" : c}

+0

Они содержат огромное количество вложенных ключей, поэтому сопоставление невозможно для всех ключей, которые, как мне кажется, – Suren

2
a = {'name1':'tom'} 
b = {'name2':'harry'} 
c = {'name3':'peter'} 

name = 'name2' 

for k, v in locals().copy().items(): 
    if isinstance(v, dict): 
     if name in v: 
      print('"{}" contains id dict "{}"'.format(name, k)) 
# "name2" contains in dict "b" 

Но обычно вы не должны этого делать. Создание Dict из dicts и итерацию через него:

ds = { 
    'a': {'name1':'tom'}, 
    'b': {'name2':'harry'}, 
    'c': {'name3':'peter'}, 
} 

name = 'name2' 

for k, v in ds.items(): 
    if name in v: 
     print('"{}" contains id dict "{}"'.format(name, k)) 
# "name2" contains in dict "b" 
1

Так как вы сказали, что вы хотели получить b назад как переменная, в один прекрасный момент я могу думать, что это делает список ваших словарей и перечисляет их.

a = {'name1':'tom'} 
b = {'name2':'harry'} 
c = {'name3':'peter'} 
name = 'name2' 

dicts = list(a,b,c) 
required_dic = findDict(dicts) 


def findDict(dicts):  
    for obj in dicts: 
     if "name2" in obj: 
      return obj 

но, как сказал @germn, лучшей идеей было бы создать вложенный словарь.

+1

'dict.has_key (key) '[устарело] (https://docs.python.org/2/library/stdtypes.html#dict.has_key) в пользу' key in dict'. См. [Этот вопрос] (https://stackoverflow.com/questions/1323410/has-key-or-in) –

+0

@PeterWood Спасибо! Я отредактировал его. – Krishh

1

Давайте предположим, что вы поставите ссылки на ваши словари в Iterable

l = [da, db, dc, ...] 

что вы инициализировать ссылку на один из ваших словарей недопустимого значения

d = None 

, чтобы узнать, какой словарь имеет word в качестве ключа это просто

for _ in l: 
    if word in _: 
     d = _ 
     break 

в этой точке , Либо вы не нашли word ни в одном из ваших dicts и d, следовательно, по-прежнему равна None, или вы нашли словарь, содержащий word и вы можете делать все, что вы хотите ему

if d: 
    ... 
Смежные вопросы