【发布时间】:2013-06-24 03:10:04
【问题描述】:
我正在尝试读取 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。
【问题讨论】:
-
不要使用列表推导来产生副作用,它不被认为是 Pythonic。使用这样的 LC:
e = [1 if x in c else 0 for x in xrange(m, -1, -1)]
标签: python python-2.7 polynomial-math finite-field galois-field