Как объединить дубликаты элементов в списке при добавлении их «коэффициента»? - PullRequest
0 голосов
/ 29 ноября 2018

Я пишу функцию 'упрощение', чтобы упростить полиномы, чтобы simplify("2xy-yx") мог вернуть "xy", simplify("-a+5ab+3a-c-2a") может вернуть "-c+5ab" и т. Д.

Я нахожусь на стадии, гдеЯ разбил многочлены на несколько одночленов как элементы списка и разделил коэффициент одночленов и буквенную (переменную) части.

Например,

input = '3xy+y-2x+2xy'

Мой процесс дает мне:

Var = ['xy', 'y', 'x', 'xy']
Coe = ['+3', '+1', '-2', '+2']

Что я хочу сделать, это объединить те же самые мономы и сложить их соответствующие коэффициенты вдругой список одновременно.

Мой код был:

Play1 = Letter[:]
Play2 = Coe[:]
for i in range(len(Play1) - 1):
    for j in range(i+1, len(Play1)):
        if Play1[i] == Play1[j]:
            Letter.pop(j)
            Coe[i] = str(int(Play2[i]) + int(Play2[j]))
            Coe.pop(j)

Но, похоже, это работает только со списками, где каждый повторяющийся элемент появляется не более двух раз.Например, ввод «-a + 5ab + 3a-c-2a» дает мне:

IndexError: pop index out of range

Я думал об использовании set, но это изменит порядок.

Какой лучший способ продолжить?Спасибо.

Ответы [ 4 ]

0 голосов
/ 30 ноября 2018

ПОПРОБУЙТЕ: с использованием regex

import re
# a = '3xy+y-2x+2xy'
a = "-a+5ab+3a-c-2a"
i = re.findall(r"[\w]+", a)
j = re.findall(r"[\W]+", a)
if len(i)!=len(j):
  j.insert(0,'+')
d = []
e = []
for k in i:
  match = re.match(r"([0-9]+)([a-z]+)", k, re.I)
  if match:
    items = match.groups()
    d.append(items[0])
    e.append(items[1])
  else:
      d.append('1')
      e.append(k)
print(e)
f = []
for ii,jj in zip(j,d):
  f.append(ii+jj)
print(f)

Вход:

a = "-a+5ab+3a-c-2a"

Выход:

['a', 'ab', 'a', 'c', 'a']
['-1', '+5', '+3', '-1', '-2']

Вход:

a = '3xy+y-2x+2xy'

Вывод:

['xy', 'y', 'x', 'xy']
['+3', '+1', '-2', '+2']
0 голосов
/ 29 ноября 2018

Обычно это тот случай, когда dict пригодится:

from collections import defaultdict

Var = ['xy', 'y', 'x', 'xy']
Coe = ['+3', '+1', '-2', '+2']

polynom = defaultdict(int)
for var, coeff in zip(Var, Coe):
    polynom[var] += int(coeff)

Var, Coe = list(polynom.keys()), list(polynom.values())
0 голосов
/ 29 ноября 2018

Ваш ввод был:

input = '3xy+y-2x+2xy'

Вы достигли до:

Var = ['xy', 'y', 'x', 'xy']
Coe = ['+3', '+1', '-2', '+2']

Используйте приведенный ниже код, чтобы получить -> +5xy-y-2x

def varCo(Var, Coe):

    aa = {}
    for k, i in enumerate(Var):
        if i in aa: aa[i] += int(Coe[k])
        else      : aa[i] = "" if int(Coe[k]) == 1 else "-" if int(Coe[k]) == -1 else int(Coe[k])
    aa = "".join([("" if "-" in str(v) else "+") + str(v)+i for i, v in aa.items() if v != 0])
    return aa

Var = ['xy', 'y', 'x', 'xy']
Coe = ['+3', '-1', '-2', '+2']

print (varCo(Var, Coe))

#Result --> +5xy-y-2x
0 голосов
/ 29 ноября 2018

Объедините свои списки с zip() для упрощения обработки и создайте новый список:

newVar = []
newCoe = []

for va, co in zip(Var, Coe):

    # try/except (EAFP) is very Pythonic
    try:
        # See if this var is seen
        ind = newVar.index(va)

        # Yeah, seen, let's add the coefficient
        newCoe[ind] = str(int(newCoe[ind]) + int(co))

    except ValueError:
        # No it's not seen, add both to the new lists
        newVar.append(va)
        newCoe.append(co)

Поскольку все элементы обрабатываются в их первоначальном порядке, а также с использованием добавления списка вместо хеш-таблиц (как set и dict), порядок сохраняется.

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