0

リストを取得してテキスト ファイルと比較し、テキスト ファイルに表示されるリストから要素を削除しようとしています。

私が持っているコードは次のとおりです。

baselist = open("testfile.txt", 'r')
twolist = ["one","two","three","four","five"]
for y in baselist:
    for x in range(0,len(twolist)):
        print("Working %s vs %s") % (twolist[x], y)
        if twolist[x] == y:
            print("Match!")
            remove.twolist[x]
baselist.close()

これを実行すると、「1対1」などを比較していることが出力に表示され、明らかに問題があることがわかりますが、if twolist[x] == y:私の人生では、それを機能させることができません。私は読んで読んで、グーグルでグーグルで検索しましたが、明らかに何かが欠けています。誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

1
  • 通常、ファイルを開くにはwith

  • ファイルから読み取る場合、改行文字は削除されません。たとえば、'two\n' != 'two'あなたの比較テストは失敗します。.strip() または .rstrip() を使用して、末尾の改行を含む空白を削除します

  • for index in range(len(mylist))通常は悪い兆候です。としてリストを操作し、次のようfor value in mylistにフィルタリングする方が良い[value for value in mylist if test(value)]

  • 最初のprintステートメントのインデントが間違っています

  • remove構文が間違っています。である必要があり、これは xの最初のtwolist.remove(x)出現のみを削除することに注意してください

  • あなたのアルゴリズムは O(mn) です。ここで、m は の行baselist数、n は の行数twolistです。少し注意して、代わりに O(m+n) にすることもできます。

元の順序が重要な場合は、

with open('testfile.txt') as inf:
    twoset = set(twolist).difference(line.strip() for line in inf)

twolist = [item for item in twolist if item in twoset]

さもないと、

with open('testfile.txt') as inf:
    twolist = list(set(twolist).difference(line.strip() for line in inf))
于 2012-07-03T01:22:22.780 に答える
0

あなたが逃したrstrip()

if twolist[x] == y.rstrip():

また、反復処理中にリストを変更しないでください。

リスト内包表記をより適切に使用し、セットを使用して高速化します。

$ cat 1.py 
baselist = set([x.rstrip('\n') for x in open("testfile.txt", 'r')])
twolist = ["one","two","three","four","five"]
baselist = [x for x in twolist if x not in baselist]
print baselist

$ cat testfile.txt 
one
three

$ python 1.py 
['two', 'four', 'five']
于 2012-07-03T01:22:15.933 に答える