Получить ключ, который имеет несколько значений по значениям в словаре - PullRequest
2 голосов
/ 08 апреля 2020

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

d = {'salam':('hi', 'ciao', 'bonjour'), 'mamnoon':('thanks', 'grazie', 'merci')}
l = ['hi', 'thanks', 'very', 'much']
l1 = []
for i in range(0, len(l)):
    search_val = l[i]
    for key, val in d.items():
        if val == search_val:
            l1.append(key)
        else:
            l1.append(l[i])
print(l1)

вывод, который я ищу, это, но я получаю пустой список

['salam', 'mamnoon', 'very', 'much']

Ответы [ 3 ]

2 голосов
/ 08 апреля 2020

Вы ищете if search_val in val вместо if val == search_val, поскольку val - это кортеж из нескольких строк, и вы не хотите проверять, равен ли ваш search_val полному кортежу, просто кортеж содержит ваш search_val.

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

d = {'salam':('hi', 'ciao', 'bonjour'), 'mamnoon':('thanks', 'grazie', 'merci')}
l = ['hi', 'thanks', 'very', 'much']
l1 = []
for search_val in l:
    for key, val in d.items():
        if search_val in val:
            l1.append(key)
            break
    else:
        l1.append(search_val)
print(l1)

Вывод:

['salam', 'mamnoon', 'very', 'much']

Здесь мы прекращаем поиск в словаре, как только мы нашли ключ с search_val (так как мы предполагаем, что только один ключ будет иметь это значение в своем кортеже). Предложение else for l oop будет выполнено, если l oop завершится нормально (т.е. не завершится из-за нажатия на оператор break), что соответствует search_val, не найденному , В этом случае мы append от search_val до l1.

Альтернатива без использования синтаксиса for/else может использовать флаг found:

d = {'salam':('hi', 'ciao', 'bonjour'), 'mamnoon':('thanks', 'grazie', 'merci')}
l = ['hi', 'thanks', 'very', 'much']
l1 = []
for search_val in l:
    found = False
    for key, val in d.items():
        if search_val in val:
            l1.append(key)
            found = True
    if not found:
        l1.append(search_val)
print(l1)
1 голос
/ 08 апреля 2020

ваше решение почти верно, но вам нужно отредактировать внутреннее условие для l oop

val: это кортеж, и результат сравнения кортежа и строки будет ложным, поэтому он ничего не добавляет и вы получите пустой список.

вместо if val == search_val: try if search_val in val:

это приведет к l1 = ['salam', 'mamnoon']

0 голосов
/ 08 апреля 2020

А как насчет комбинации метода itertools.chain() в сочетании с определением списка, чтобы сделать это в одной строке:

import itertools 
d = {'salam':('hi', 'ciao', 'bonjour'), 'mamnoon':('thanks', 'grazie', 'merci')}
l = ['hi', 'thanks', 'very', 'much']
l1 = [i if not i in itertools.chain(*d.values()) else [key for key in d if i in d[key]][0] for i in l]
print(l1)

Возвращает:

['salam', 'mamnoon', 'very', 'much']
...