Создать список из основного списка с соответствующими словами, независимо от последовательности - PullRequest
0 голосов
/ 05 января 2019

Я создал список, назовем его главным списком

master=['abc 1.2 px', 'pqr 5.4 tr', '1.8 cmq', 'pst 2.5']

Теперь у меня есть другой список, как

l1=['1.2 abc px', 'pqr tr 5.4', 'cmq 1.8', '1.8 cmq', '2.5 pst', 'abc 1.2 px']

Я хочу изменить l1, который будет принимать имена от master, где представлены все слова независимо от последовательности. например, измененный список будет

l2=['abc 1.2 px', 'pqr 5.4 tr', '1.8 cmq', '1.8 cmq', 'pst 2.5','abc 1.2 px']

Как это сделать с помощью python?

1 Ответ

0 голосов
/ 05 января 2019

Рассмотрите возможность создания «нормализованного» словаря, в котором значения - это слова из master, а ключи - их уникальные представления, такие как отсортированные наборы подслов. Если все подслов в слове всегда разные, вместо него можно использовать frozenset.

def normalize(word):
    return tuple(sorted(word.split()))
    # return frozenset(word.split())

normalized = {normalize(m) : m for m in master}
#{('1.2', 'abc', 'px'): 'abc 1.2 px', 
# ('5.4', 'pqr', 'tr'): 'pqr 5.4 tr', 
# ('1.8', 'cmq'): '1.8 cmq', ('2.5', 'pst'): 'pst 2.5'}

Теперь вы можете преобразовать каждое слово в l1 в нормализованную форму и найти его в словаре:

[normalized.get(normalize(m), m) for m in l1]
#['abc 1.2 px', 'pqr 5.4 tr', '1.8 cmq', '1.8 cmq', 'pst 2.5', 'abc 1.2 px']

Обратите внимание, что если слово отсутствует в master, его удобно оставить без изменений.

...