Форматирование строки с элементами в списке на основе условий - PullRequest
0 голосов
/ 09 марта 2020

Итак, я создал серию грамматик для использования в методе класса, который я создал. Каждый список может состоять из n элементов, поэтому размещение каждого слова с помощью индекса списка - это просто претензии wordlist[1:], однако мне нужно использовать оператор |, а это невозможно сделать с помощью явных строковых индексов (по крайней мере, я так думаю) , Это то, что я написал до сих пор:

noun_types = ['port', 'harbor', 'harbour']
target_pronouns = ['rotterdam', 'moscow']

grammer1 = (
                F"""
                S ->  Det N P NP
                P -> P
                NP -> '{target_pronouns[0]}' | '{target_pronouns[1]}'
                Det -> 'the' | 'a'
                P -> 'of'
                N -> '{noun_types[0]}' | '{noun_types[1]}' | '{noun_types[2]}'
                """)

В идеале, я хотел бы иметь возможность передать список из n имен местоимений и существительных и отформатировать строки с каждым элементом без явного строковые индексы, так что-то вроде этого:

noun_types = ['port', 'harbor', 'harbour']
target_pronouns = ['rotterdam', 'moscow']

grammer1 = (
                F"""
                S ->  Det N P NP
                P -> P
                NP -> '{target_pronouns[range(0, len(target_pronouns))]}'
                Det -> 'the' | 'a'
                P -> 'of'
                N -> '{noun_types[range(0, len(target_pronouns))]}'
                """)

Однако я не уверен, как реализовать оператор |, тем более любое условное форматирование при форматировании строк. Форматирование грамматики основано на конструкторе грамматики nltk, используемом в этом контексте:

from nltk.parse.generate import generate
from nltk import CFG

grammar = CFG.fromstring(grammer1)
for sentence in generate(grammar, n = 10, depth = 5):
words = ' '.join(sentence)

Это немного запутанный вопрос, поэтому я рад попытаться прояснить любую путаницу!

1 Ответ

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

Так что я думаю, что есть хакерский способ сделать это: экранировать строки с символом ', а затем просто подключить их к вашей строке, используя " | ".join().

Добавить оба ' до и после каждой строки ваших списков ввода:

noun_types = [f"'{noun}'" for noun in noun_types]
target_pronouns = [f"'{pronoun}'" for pronoun in target_pronouns]

Теперь вы можете просто поместить их в строку f, используя " | ".join(). Это будет работать независимо от размеров ваших входных списков, не требуя индексов.

print(f"""
NP -> {' | '.join(target_pronouns)}
N -> {' | '.join(noun_types)}
""")

Вывод:

NP -> 'rotterdam' | 'moscow'
N -> 'port' | 'harbor' | 'harbour'

Другое решение, если все усложняется, может быть go в Jinja шаблонизатор хотя сейчас кажется достаточным взломать его и избежать лишней библиотеки.

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