Python将二进制多项式读入列表

时间:2013-06-24 03:10:05

标签: python python-2.7 polynomial-math finite-field galois-field

我试图在GF(2)有限域中读取多项式,对于系数或常数基本上只有1或0,并且真正区分1部分多项式与另一个的唯一数字是指数。但指数最终只标记结果列表中位置的“位置”或索引,然后仅标记为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(in 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。

1 个答案:

答案 0 :(得分:2)

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)