У меня есть этот словарь:

dict = {'a': [1, 'Hello', 3], 'b': {1, 2, 90}, 'c': (1, 2, 'tuple'), 'd': 3}

Я пытался напечатать каждый ключ содержит значение 3. Выходные данные должны быть a и d

Я устал что-то вроде этого:

[key for key, vals in dict.items() if 3 in vals]

Но ошибка: int не повторяется, я также пытался использовать для:

>>> for i in dict.values():
...     if 3 in dict.values():
...             print(i)

Я тоже пробовал это, но ничего не работает

>>> for i in dict.keys():
...     if 3 in dict[i]:
...             print(i)

ЧАСТЬ 2: Допустим, я могу напечатать ключ, если значение содержит 3, тогда как я могу получить индекс, если значением является список или кортеж?

0
user8454691 30 Авг 2017 в 20:33

5 ответов

Лучший ответ
[key for key, vals in dict.items() if 3==vals or 3 in vals]
3
akp 30 Авг 2017 в 17:39

Вы получаете ошибку, потому что не все ваши значения имеют одинаковый тип. Ваша оценка должна состоять в том, что если ключ равен 3, то возвращает true, или если значение является контейнером, проверьте, является ли 3 его частью.

Чтобы получить индекс значения в списке ИЛИ кортеже, вы можете использовать

>>> l = [1, 2, 'just', 3, 'p']
>>> l.index(3)
3

>>> t = (1, 2, 'word', 3)
>>> t.index(3)
3
>>> 
1
Chen A. 30 Авг 2017 в 17:36

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

dict = {'a': [1, 'Hello', 3], 'b': {1, 2, 90}, 'c': (1, 2, 'tuple'), 'd': 3}

print [key for key, vals in dict.items() if 3 == vals or 3 in vals]
['a', 'd']

Здесь у вас есть живой пример

0
Netwave 30 Авг 2017 в 17:47

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

def in_key(value, vals):
    if isinstance(vals, (list, tuple, set)):
        return value in vals
    else:
        return value == vals

lst = [key for key, vals in dict.items() if in_vals(3, vals)]
0
Christian Dean 30 Авг 2017 в 17:39
for k, v in dict.items():
    try:
        if 3 in v:
            print(k)
    except TypeError:
        if v == 3:
            print(k)
1
Dan 30 Авг 2017 в 17:40