Как разобрать все коэффициенты полиномиальной строки в python - PullRequest
1 голос
/ 24 марта 2020

У меня есть файл .txt, который содержит огромные полиномы, хранящиеся в виде строк. Репрезентативный пример будет следующим. 6*n101110111*n111111111 + 3*n101111101 + 6*n101111111 + n111111111 Но в общем случае полиномы состоят из 'n + str (все возможные двоичные цифры длины 9)', умноженные в разных порядках на коэффициенты. Количество терминов и «+» заранее неизвестно. Результат должен быть,

[6,3,6,1]

Еще лучше было бы получить его как словарь

{ n101110111*n111111111: 6, n101111101: 3, n101111111: 6, n111111111 :1}

Ответы [ 4 ]

3 голосов
/ 24 марта 2020

Я думаю, у меня есть решение для вас:


stringList = yourStringHere.split("+")
outputDict = {}

for sub in stringList:
    values = sub.split("*")
    try:
        baseNum = int(values[0])
        poly = "*".join(values[1:]).strip()
    except:
        baseNum = 1
        poly = "*".join(values).strip()
    outputDict[poly] = baseNum 

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

Дайте мне знать, помог ли этот подход! Лучший! * * 1006

3 голосов
/ 24 марта 2020

вы можете использовать:

import re

s = '6*n101110111*n111111111 + 3*n101111101 + 6*n101111111 + n111111111'

l = [g.group().split('*', 1)  for g in re.finditer(r'\b([\dn*]+)\b', s)]
{e[-1]: 1 if len(e) == 1 else int(e[0]) for e in l}

вывод:

{'n101110111*n111111111': 6,
 'n101111101': 3,
 'n101111111': 6,
 'n111111111': 1}
3 голосов
/ 24 марта 2020

Такое регулярное выражение ((\d)?\*?((?:n\d+)(?:\*n\d+)*)) (Regex demo) выполнит работу

line = "6*n101110111*n111111111 + 3*n101111101 + 6*n101111111 + n111111111"
res = {}

matches = re.findall(r"(?:(\d)?\*?((?:n\d+)(?:\*n\d+)*))", line)
print(matches)  # [('6', 'n101110111*n111111111'), ('3', 'n101111101'), ('6', 'n101111111'), ('', 'n111111111')]

for match in matches:
    res[match[1]] = match[0] or 1
print(res)  # {'n101110111*n111111111': '6', 'n101111101': '3', 
               'n101111111': '6', 'n111111111': 1}
1 голос
/ 24 марта 2020

Вы можете использовать регулярное выражение

r" (?:(\d+)\*)?([^ +-]+)

Python demo

Модуль регулярных выражений выполняет следующие операции для каждого совпадения:

(?:        # begin a non-capture group
  (\d+)    # match 1+ digits in capture group 1
  \*       # match '*'
)          # end non-capture group
?          # optionally match non-capture group
([^ +-]+)  # match 1+ chars other than spaces, '+', and '-' in
           # capture group 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...