Нет никакого способа сделать это без явного или неявного цикла.
То есть, вы можете сделать одно из них:
key = next(lst for lst in d.values() if 'b' in lst)
Но в любом случае, это действительно делает то же самое для цикла делает. В частности, это примерно то же самое:
for lst in d.values():
if 'b' in lst:
key = let
break
... это, вероятно, именно цикл, который вы собираетесь писать.
Однако, если вы собираетесь сделать это несколько раз, вы можете просто сделать цикл один раз, чтобы создать соответствующую структуру данных, то вы можете просто сделать быстрый поиск каждый раз.
Например, давайте создадим карту от каждого члена списка в списке он находится в:
valmap = {val:lst for lst in d.values() for val in lst}
Теперь, каждый раз, когда вы хотите узнать, какой список 'b'
находится, просто сделать это:
valmap['b']
Из вашего вопроса, вы, возможно, спрашивали об использовании map
. Во-первых, map
по-прежнему представляет собой неявный цикл for
. Во-вторых, map
действительно не дает вам никакого способа делать то, что вы хотите; вы можете использовать его, например, создать новую последовательность с True вместо списка, содержащего 'b'
, и False
везде, но вам все равно придется искать эту последовательность, чтобы найти True
. Здесь вы найдете filter
. Вы можете написать genexpr решение выше, как:
key = next(filter(lambda lst: 'b' in lst, d.values()))
И это в значительной степени точно то же самое, как genexpr. (В CPython это, вероятно, немного быстрее, чем явный цикл и немного медленнее, чем genexpr, но это также, вероятно, не имеет значения.)
В качестве побочного примечания, это плохая идея вызвать словарь 'dict'. Как только вы это сделаете, вы больше не сможете обращаться к встроенному типу и конструктору с тем же именем. – abarnert