Как вы перечисляете ключевые слова как условия более эффективно? - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь написать скрипт, который очищает и сохраняет записи bibtex в моем библиотечном файле. Мне нужен скрипт, чтобы прочитать файл .bib и затем записать его содержимое в файл библиотеки, но исключая определенные поля / строки. Я пробовал такие вещи, как помещать каждое поле, которое я хочу исключить, в

exclusions = ["exclusion1","exclusion2","exclusion3",..."exclusionN"]

, а затем циклически повторять его так, как это было

if [ex for ex in exclusion not in line]:
   ...code...

Но это не сработало, так что в конце концов я согласился с этим

...
with open("newbib.bib", "a") as f1:
    for line in lines:
         if "abstract" not in line and "keywords" not in line and "issn" not in line and "ISSN" not in line and "url" not in line and "URL" not in line and "eprint" not in line and "publisher" not in line and "address" not in line and "number" not in line and "day" not in line and "month" not in line and "pages" not in line:
                            f1.writelines(line)
...

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

Ответы [ 3 ]

3 голосов
/ 12 февраля 2020

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

if all(ex not in line for ex in exclusion):
    ...
1 голос
/ 12 февраля 2020

Вы можете использовать регулярное выражение для проверки сразу всех исключений:

>>> exclusions = ["exclusion1", "exclusion2", "exclusion3"]
>>> import re
>>> exclude = re.compile('|'.join(map(re.escape, exclusions))).search
>>> not exclude('hello world')
True
>>> not exclude('exclusion2 world')
False

Таким образом, вы можете написать оператор if, например:

if not exclude(line):
    ...
1 голос
/ 12 февраля 2020

Это будет работать:

ex_list = [ex for ex in exclusions if x != "exclusion1" and x != "exclusion2"]

(или)

сохранить исключения, которые будут пропущены в списке, если ваше состояние больше, например

skip_list = []
ex_list = [ex for ex in exclusions if ex not in skip_list]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...