Как мне получить список ключей, где ключи находятся в каком-то тексте? - PullRequest
1 голос
/ 02 марта 2020

У меня есть словарь и некоторый текст:

dogs = {"jack russell": "benny", 
        "labrador": " oscar",
        "golden retriever": "ol' yeller"}

some_text = ["I have a jack russell and a golden retriever. They are 2 and 4 years old.", "My neighbour has a 3 cats."]

Вывод, который я хочу получить:

[['jack russell', 'golden retriever'], [None]]

То, что я получил до сих пор:

some_list = []

for x in dogs.keys():
    matched_dogs = []
    for y in some_text:
        if x in y:
            matched_dogs.append(x)
        else:
            matched_dogs.append(None)
    some_list.append(matched_dogs)         

print(some_list)
[['jack russell', None], [None, None], ['golden retriever', None]]

Мой сценарий не совсем там, но, конечно, есть простой ответ. Любое движение в правильном направлении приветствуется.

Ответы [ 7 ]

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

Нечто более компактное:

# Get OP's original result
some_list = [ [x for x in dogs.keys() if (x in y) ] for y in some_text]
# Fix the lines w/o any dogs
some_list = [z if z else [None] for z in some_list]
1 голос
/ 02 марта 2020
for y in some_text:
    matched_dogs = []
    for x in dogs.keys():
        if x in y:
            matched_dogs.append(x)
    if len(matched_dogs) == 0:
        matched_dogs.append(None)
    some_list.append(matched_dogs)

Это желаемый результат?

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

Это дает желаемый результат:

res = [[], []]
for key in dogs:
    for text in some_text:
        if key in text:
            res[0].append(key)
            break
    else:
        res[1].append(None)

Обратите внимание, что else после for будет выполняться только в том случае, если for закончился естественным образом, а не через break.

0 голосов
/ 02 марта 2020

Поздний ответ, но вот мои 2 c:

result = []
for text in some_text:
    temp = [k for k in dogs if k in text]
    if not temp:
        temp.append(None)
    result.append(temp)
print(result)
# [['jack russell', 'golden retriever'], [None]]

Демо

0 голосов
/ 02 марта 2020

Вы можете использовать однострочное понимание:

[x if len(x) > 0 else [None] for x in [[key for key in dogs if key in text]
                                       for text in some_text]]

С вашими данными вы получите, как и ожидалось:

[['jack russell', 'golden retriever'], [None]]
0 голосов
/ 02 марта 2020

Вы можете использовать filter здесь.

>>>ans=[list(filter(lambda x: x in text,dogs)) for text in some_text]
# [['jack russell', 'golden retriever'], []]

Теперь замените [] на [None]

ans=[lst if lst else [None] for lst in ans]
# [['jack russell', 'golden retriever'], [None]]
0 голосов
/ 02 марта 2020

Вы можете выполнить итерацию по списку и проверить наличие ключей в элементах, добавить в список, если это так, иначе None, если ничего не найдено:

dogs = {"jack russell": "benny", 
        "labrador": " oscar",
        "golden retriever": "ol' yeller"}

some_text = ["I have a jack russell and a golden retriever. They are 2 and 4 years old.", "My neighbour has a 3 cats."]

res = []
for x in some_text:
    lst = []
    for k in dogs:
        if k in x:
            lst.append(k)
    if not lst:
        lst.append(None)
    res.append(lst)

print(res)

Вывод точно что желательно:

[['jack russell', 'golden retriever'], [None]]
...