2016-03-17 2 views
1

У меня есть следующий рабочий ДИКТ (2 ключа в значение):проверить, если элемент является частью ключей Dict

worker = {('admin', 'unknown'): 1, ('worker1', 'Paul'): 1, ('worker2', 'Francis'): 1} 

В моем коде я хочу, чтобы проверить, является ли функция работника уже есть запись:

if work['function'] in worker: 
    # increment amount 

Почему это не так? work['function'] будет admin или worker1 т.д.

Это потому, что я должен указать второй ключ Dict в моем if, а? Потому что я не могу/не хочу этого делать

Как я могу заставить это быть правдой?

+1

ключ должен точно соответствовать 'work ['function']' ...В противном случае вам нужно перебирать ключи: 'if any (work ['function'] в ключе для ключа в рабочем файле: ....' – falsetru

+0

хорошо, что сработало, спасибо – JustSomeDude

+0

Нет «второго ключа», но вы используете кортеж как ключ, поэтому, если вы проверяете 'in', весь кортеж должен совпадать. –

ответ

1

Ключ словаря является кортежем, как ('admin', 'unknown'). Вы можете легко проверить, что это будет работать:

if ('admin', 'unknown') in worker: 
    print("toto") 

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

  • изменить структуру данных (например, для диктата dicts)
  • использовать функцию, которая будет выполнять итерацию по всем элементам dict, чтобы выполнить сравнение, которое вы хотите (и страдаете плохими характеристиками, если большой бит). [Редактировать: Обычно предлагаемое решение для понимания списка от Merlin2011 в его ответе]

Пример с Dict из dicts, что делать то, что вы описали:

worker = {'admin':{'unknown': 1}, 'worker1':{'Paul': 1}, 'worker2':{'Francis': 1}} 
if 'admin' in worker: 
    print("Here is admin") 

В вашем случае, вы можете скорее нужен простой Dict, потому что вы будете по-видимому, всегда есть только один набор значений, соответствующих ключу , так просто:

worker = {'admin': ('unknown', 1), 'worker1': ('Paul', 1), 'worker2': ('Francis', 1) } 
0

Вы можете использовать itemgetter , чтобы легко получить первый элемент ключевого кортежа.

+0

Вы должны точно определить, что выступления будут очень плохими для больших диктонов по сравнению с тем, что вы можете ожидать от поиска в dict –

+0

@ColinPitrat При использовании ** современного ** языка, такого как Python ** 3 **, не так много проблемы поскольку 'dict.keys()' возвращает объект _view_ ключей dict, который работает довольно быстро. И 'map' возвращает _map object_ вместо' list', как в Python 2. – Sevanteri

+0

@ColinPitrat Но да, я согласен с вашим ответом. Структура диктама не очень оптимальна. – Sevanteri

0

Python не интерпретирует такой словари как «два ключа за значение», а «ключи - это кортежи». Это означает, что ('admin', 'unknown') in worker даст True, но не 'admin' in worker.

Если вы хотите использовать словари с более чем одним ключом для каждой записи, вам понадобится другая структура данных. Вы можете создать свой собственный или использовать некоторые из существующих, например the multi_key_dict package.

Вы также можете цикл над клавишами и поиск, если ваша строка включена в ключах, например:

for k in worker.keys(): 
    if work['function'] in k: 
     return k 
0

Если вы не хотите, чтобы указать вторую часть ключа, вы можете использовать список понимание, чтобы найти все, что соответствует первой части ключа. Обратите внимание, что производительность является линейной, а не O (1), как вы могли бы получить из хеш-таблицы.

worker = {('admin', 'unknown'): 1, ('worker1', 'Paul'): 1, ('worker2', 'Francis'): 1} 

matching_keys = [key for key in worker if key[0] == "admin"] 
for key in matching_keys: 
    worker[key]+=1 

print worker 
Смежные вопросы