Python читает двоичный полином в список

Я пытаюсь прочитать полином в конечном поле GF (2), который в основном равен 1 или 0 для коэффициентов или констант, и единственное число, которое действительно отличает одну часть полинома от другой, - это показатель степени. Но экспонента заканчивает тем, что отмечает только «место» или индекс местоположения в результирующем списке, который затем помечается только как 1. Каждая другая позиция в результирующем списке - это 0.

Некоторый код с примером:

a = "x**14 + x**1 + x**0"
#b = [int(s) for s in a.split() if s.isdigit()]
import re
b = re.findall(r'\d+', a)
print b
c = [int(x) for x in b]
print c
d = []; m = max(c)
print c[1]
for i in range(m):
    d.append(0)
#    if c[i]>=0: d.insert(i,1)
#    else: d.insert(i,0)

for i in c:
    del d[i-1]
    d.insert(i,1)

#d.insert(m,1);
d.reverse()
print d,len(d)

Итак, как вы можете видеть, это выводит:

>>> 
['14', '1', '0']
[14, 1, 0]
1
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1] 14
>>> 

Но он должен выводить 1 в начале списка (полиномиальные степени идут от высокого к низкому слева направо, и список должен быть таким же). Длина правильная, так как это высшая степень. Сейчас я изучаю Python, поэтому я уверен, что профессионалы Python недовольны моим кодом. Для тех, кто является профессионалом, пожалуйста, не стесняйтесь предлагать более Pythonic решение или что-то еще конструктивное, поскольку я пытаюсь как можно быстрее избавиться от всех привычек новичка. Я добавлю это в функцию (на самом деле это входит в функцию внутри класса) позже, это просто для того, чтобы понять основную идею.


РЕДАКТИРОВАТЬ:

Из приведенного ниже ответа (я не беру на себя ответственность за идею, просто часть кода), я сделал это, что кажется Pythonic, но не уверен, как лучше всего интегрировать код, где я извлекаю с помощью регулярного выражения и конвертирую в int (в списке c ):

a = "x**14 + x**1 + x**0"
#b = [int(s) for s in a.split() if s.isdigit()]
import re
b = re.findall(r'\d+', a)
print b
c = [int(x) for x in b]
m = max(c)
e = []
#[e.append(1) if i in c else e.append(0) for i in range(m,-1,-1)]
e = [1 if x in c else 0 for x in xrange(m, -1, -1)] ##better solution
print e

Мне интересно, как упростить этот код и сделать его более Pythonic.


person stackuser    schedule 24.06.2013    source источник
comment
Не используйте понимание списка для побочного эффекта, это не считается pythonic. Используйте LC следующим образом: e = [1 if x in c else 0 for x in xrange(m, -1, -1)]   -  person Ashwini Chaudhary    schedule 24.06.2013


Ответы (1)


range(14) возвращает числа от 0 до 13, 14 не включительно:

Пытаться:

d = []
#no need of two loops here, if the number is present in c then append 1 else 0
for i in range(m, -1, -1): #goes from 14 to 0, -1 is not inclusive
    if i in c:
        d.append(1)
    else:
        d.append(0)

#one-liner : d = [1 if x in c else 0  for x in xrange(14, -1, -1)]
print d,len(d)
#prints [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1] 15

Более короткая версия вашего кода:

import re
a = "x**14 + x**1 + x**0"
c = [int(m.group(0)) for m in re.finditer(r'\d+', a)] #re.finditer returns an iterator
m = max(c)
d = [1 if x in c else 0  for x in xrange(m, -1, -1)]
print d,len(d)
person Ashwini Chaudhary    schedule 24.06.2013
comment
Благодарность! я использовал findall вместо finditer (в оригинальном LC), и он все еще работал - person stackuser; 24.06.2013
comment
@stackuser findall работает нормально, но возвращает весь список сразу (не так эффективно для памяти), а finditer возвращает итератор. - person Ashwini Chaudhary; 24.06.2013
comment
Хорошо, @AshwiniChaudhary, как мне рассчитать многочлен, например x**3 + x**2 + x + 1 - person bhansa; 22.02.2016