【问题标题】:Python read binary polynomial into listPython将二进制多项式读入列表
【发布时间】: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


【解决方案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)

【讨论】:

  • 谢谢!我使用 findall 而不是 finditer(在原始 LC 中),它似乎仍然有效
  • @stackuser findall 工作正常,但它一次返回整个列表(不是那么内存效率),而 finditer 返回一个迭代器。
  • 很好,@AshwiniChaudhary 我应该如何计算像x**3 + x**2 + x + 1这样的多项式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多