0

我已经编写了一些代码来根据此处描述的标准从存储 cnf 的文件中加载 cnf 。

该文件是:

c  simple_v3_c2.cnf      // lines bigining by c are comments
c  
p cnf 3 2                // the line bigining by p is the description of the pb
1 -3 0                   // folowing lines are formulation of the pb, with 0 as ending caractere
2 3 -1 0

我想将它加载到 [[1, -3][2,3,-1]]

我编写的代码有效,但对我来说似乎很难看。我很想对此有一些反馈。(我是 python 新手)。

def loadCnfFile(fileName='example.cnf'):
""" retourne une liste de listes d'entiers decrivants la forme normale conjonctive"""
cnf=[]
cnfFile = open(fileName, 'r')
for line in cnfFile:
    if line[0]!="c" and line[0]!="p":
        l=line.split("0")[0].strip().split(" ")
        m=[]
        for k in l:
            m.append(int(k))
        cnf.append(m)
cnfFile.close()
return cnf

谢谢 !

4

3 回答 3

3

我想对您的代码的最佳反馈是以更“pythonic”的方式重写它。例如:

def cnf_lines(path):
    """Yields cnf lines as lists from the file."""

    with open(path) as fp:
        for line in fp:
            if not line.startswith(('c', 'p')):
                items = map(int, line.split())
                yield items[:-1]

关键点:

  • PEP-8 一致性(请不要在 python 中使用 camelCase)
  • with用于文件操作的上下文管理器 ( )
  • 生成器 ( yield) 而不是累积列表

注意:此代码是有意简化的,并不完全支持您链接到的规范。

于 2013-01-10T09:55:15.900 回答
2

使用list comprehension

In [66]: with open("example.cnf") as f:
        print [map(int,line.split("0")[0].split()) for line in f if line and \
                            not (line.startswith("c") or line.startswith("p"))]
   ....:     
[[1, -3], [2, 3, -1]]

或者:

with open("example.cnf") as f:
         x= lambda y,c:y.startswith(c)
         print [map(int,line.split("0")[0].split()) for line in f if line and \
                                not any(x(line,z) for z in ("c","p"))]
   ....:     
[[1, -3], [2, 3, -1]]
于 2013-01-10T09:38:28.837 回答
1

Ashwini 的代码是正确的,并且对经验丰富的程序员很有吸引力(谢谢),但对于 python 新手(你似乎是)来说,一个简单的 for 循环可能更容易理解:

result = []
with open("example.cnf") as f:
    for line in f:
        if not (line.startswith("c") or line.startswith("p")):
            result.append([int(x) for x in line.rstrip("0").rstrip("0\n").split()])
于 2013-01-10T09:52:06.310 回答