Учитывая словарь со списками строк в качестве их значений, как бы вы извлекли все ключи, где список содержит строку, уникальную для всех других списков? - PullRequest
0 голосов
/ 02 марта 2020

Например, если словарь был таким:

myDict = {"egg sandwich":["bread", "lettuce", "mayo","egg"], 
          "sad sandwich":["bread","lettuce","mayo"],
          "ham sandwich":["bread","lettuce","mayo","ham"],
          "healthy sandwich":["lettuce"],
          "breakfast sandwich":["bread","egg","mayo"]}

Функция должна возвращать "бутерброд с ветчиной", так как это единственный бутерброд, который содержит ингредиент (ветчину), уникальный для сравнения всех других списки.

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Это похоже на работу:

def get_unique_item(d):
    all_ingredients = [y for x in d.values() for y in x]

    output = []
    for name, ingredients in d.items():
        for ingredient in ingredients:
            if all_ingredients.count(ingredient) == 1:
                output.append(name)
                break

    return output

myDict = {"egg sandwich":["bread", "lettuce", "mayo","egg"], 
          "sad sandwich":["bread","lettuce","mayo"],
          "ham sandwich":["bread","lettuce","mayo","ham"],
          "healthy sandwich":["lettuce"],
          "breakfast sandwich":["bread","egg","mayo"]}


print(get_unique_item(myDict))

Вывод:

['ham sandwich']

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


Если вы действительно этого хотите, вы можете составить список из одной строки:

[name for name, ingredients in d.items() if any([y for x in d.values() for y in set(x)].count(i) == 1 for i in ingredients)]
0 голосов
/ 03 марта 2020

Я использую библиотеку Counter для получения количества элементов и беру ключ словаря, который имел уникальное значение из импорта коллекций Counter

myDict = {"egg sandwich":["bread", "lettuce", "mayo","egg"], 
          "sad sandwich":["bread","lettuce","mayo"],
          "ham sandwich":["bread","lettuce","mayo","ham"],
          "healthy sandwich":["lettuce"],
          "breakfast sandwich":["bread","egg","mayo"]}

lis=[j for i in list(myDict.values()) for j in i]
val=[i for i,j in Counter(lis).items() if j==1]
[i for i,j in myDict.items() if val[0] in j]

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...