Удалить подобное слово в списке кортежей - PullRequest
0 голосов
/ 20 марта 2020

У меня есть список таких кортежей (фраза, оценка): [('center', 1), ('car center', 2), ('rental car', 1.5), ('car center', 2), («Центр проката автомобилей», 3), («Погода», 4), ... ...]

Я хочу исключить повторяющуюся фразу по правилу:

Если одна фраза содержит слова, которые ВСЕ были показаны в другой фразе, отбросьте фразу с наименьшим количеством баллов. например, «автомобильный центр» = набор (автомобиль, центр) - это подмножество «прокатного автомобильного центра» = набор (прокат, автомобиль, центр), если два набора только пересекаются, но не являются подмножеством другого, я также не отбрасываю один из них.

Я не мог придумать лучшего способа, кроме как запустить вложенное для l oop и вытолкнуть предмет во время l oop. Я также рассматриваю возможность использования set и intersection, но мне нужно сравнить все две комбинации, есть ли способ, которым я не пропущу ни одну пару комбинаций и эффективно сделаю это?

Выход - список кортежа оценки фразы поэтому люди не найдут пар, в которых есть две фразы, одна из которых является подмножеством другой.

1 Ответ

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

Где-то по этим направлениям:

a=[('center', 1), ('car center', 2), ('rental car', 1.5), ('car center', 2), ('rental car center', 3), ('weather', 4)]

d = {}
keys_to_remove =set()
for i in a:
    keys = d.keys()

    for key in list(d.keys()):
        if (i[0] in key):
            d[key] = max(i[1],d.get(key))
        elif key in i[0]:
            d[i[0]]=max(i[1],d.get(key))
            keys_to_remove.add(key)
        else:
            d[i[0]]=i[1]

    else:
        d[i[0]]=i[1]
{k:v for k,v in d.items() if k not in keys_to_remove}
...