0

here で説明されている標準に従って、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 ではキャメルケースを使用しないでください)
  • 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 に答える