2

ファイル内の行を無視するにはどうすればよいですか?

例:

ファイルの最初の行が a または b で始まり、残りの行が c で終わることがわかっている場合、a または b で始まる行が無視され、c で終わる行が a に変換されるように、ファイルを解析するにはどうすればよいですか?ネストされたリスト?

私がこれまでに持っているもの:

fname = raw_input('Enter file name: ')

z = open(fname, 'r')

#I tried this but it converts all lines to a nested list

z_list = [i.strip().split() for i in z]

forループが必要だと思います。

for line in z:
    if line[0] == 'a':
        pass
    if line[0] == 'b':
        pass
    if line[-1] == 'c':
        list_1 = [line.strip().split()]

上記は一般的な考え方ですが、私はデッドコードを作るのが得意です! どうやってそれをアンデッドにするの?

4

6 に答える 6

9

startswithは一致する文字列のタプルを取ることができるので、これを行うことができます:

[line.strip().split() for line in z if not line.startswith(('a', 'b'))]

これは、a と b が単なる文字ではなく単語や文であっても機能します。行が a または b で始まらず、c で終わらない場合がある場合は、リスト内包表記を次のように拡張できます。

[
    line.strip().split()
    for line in z if line.endswith('c') and not line.startswith(('a', 'b'))
]
于 2009-12-19T00:57:51.097 に答える
3

非常に一般的なアプローチの 1 つは、いくつかの行を削除してファイルを「フィルタリング」することです。

import itertools
zlist = [l.strip.split() for l in itertools.ifilter(lambda line: line[0] not in 'ab', z)]

イテラブルを「選択的にフィルタリング」したいときはいつでも使用itertools.ifilterでき、述語を満たすアイテムのみを含む別のイテラブルを取得します。これが、このアプローチが非常に一般的であると私が言う理由です。 itertoolsには、無数の方法で iterable を処理するための優れた高速ツールが多数あり、勉強する価値があります。

同様の、しかし構文的に単純なアプローチは、あなたのケースで十分です(したがって、単純さのおかげでお勧めします)はif、リストコンプの句で「フィルタリング」を行うことです:

zlist = [l.strip.split() for l in z if l[0] not in 'ab']
于 2009-12-19T01:00:00.067 に答える
2

ifリスト内包表記に条件を追加できます。

z_list = [i.strip().split() for i in z if i[-1] == 'c']

また

z_list = [i.strip().split() for i in z if (i[0] <> 'a' and i[0] <> 'b')]
于 2009-12-19T00:52:17.693 に答える
1

それを行う 1 つの方法は、'pass' を 'continue' に置き換えることです。これは、何もせずにファイルの次の行に続きます。list_1 に行を追加する必要もあります

if line[-1] == 'c':
    list_1.append([line.strip().split()])
于 2009-12-19T00:50:05.417 に答える
0
f=open("file")
for line in f:
   li=line.strip()
   if not li[0] in ["a","b"] and li[-1]=="c":
      print line.rstrip()
f.close()
于 2009-12-19T01:07:59.783 に答える
0

ソリューションに関心のある方へ。

また、別の質問です。

ファイル形式の例:

c this is a comment
p m 1468 1 267
260 32 0
8 1 0

コード:

fname = raw_input('Please enter the name of file: ')

z = open(fname, 'r')

required_list = [line.strip().split() for line in z if not line.startswith(('c', 'p'))]

print required_list

出力:

[['260', '32', '0'], ['8', '1', '0']]

リスト内の文字列を整数に変換して算術演算を実行する方法について何か提案はありますか?

説明する疑似コード:

#for the second item in each sublist
     #if sum is > than first number in second line of file
         #pass
     #else
         #abort/raise error

Seafoid さん、これまでの提案に乾杯します。

@Nadia、私の一日はもう少し価値があるようです!私はこのソロをクラックしようと何時間も (何日も) 費やしました! ありがとう!

于 2009-12-19T01:50:05.860 に答える