Поиск значений в dict в Python 2.7 - PullRequest
0 голосов
/ 24 октября 2018

У меня есть словарь со следующей структурой:

dictProblems[tickets['IssueID']] = tickets['Subject'][len(TermProblem):], tickets['IssueDate'].strip()

, что означает, что одна запись dictProblems выглядит следующим образом:

dictProblems[TicketId (int)] = (Subject (string), Date (date))

Если я пытаюсь выполнить итерацию всех значенийЯ никогда не получаю хит:

if tickets['Subject'] in dictProblems.itervalues():

Как мне перебрать многомерный дикт?

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Вы можете использовать any() с выражением генератора для короткого замыкания поиска, когда совпадение найдено:

if any(tickets['Subject'] == subject for subject, _ in dictProblems.itervalues()):
0 голосов
/ 24 октября 2018

Проблема в том, что ваша dict.values состоит из повторяемых кортежей .Тестирование на tuple в такой итерации работает напрямую, но не скаляр.

В Python 3.x вы можете использовать next + zip для извлечения tuple из первых значений каждого значения словаря:

d = {'a': (1, 2), 'b': (3, 4), 'c': (5, 6)}

3 in next(zip(*d.values()))                      # True

Если вы собираетесь выполнять такие операции повторно, вы можете сохранить эти значения в set для доступа O (1), начиная с этого момента:

values_set = set(next(zip(*d.values())))
3 in values_set                                  # True

Другой вариант, жизнеспособный в Python 2.7, заключается в использовании any с пониманием генератора:

any(3 == first for first, second in d.values())  # True
any(3 == i[0] for i in d.values())               # True
any(3 == next(iter(i)) for i in d.values())      # True
0 голосов
/ 24 октября 2018

Поскольку вы не ищете конкретную дату, вы хотите искать только по темам:

if tickets['Subject'] in set(subject for subject, date in dictProblems.itervalues())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...