-1

私はスクリプトに取り組んでおり、スクリプトはテキストファイルを読み取り、指定された文字(a、a、r、d、v、a、r、k)が各行にあるかどうかをテストする必要があります。1つではなく3つの異なるaをチェックしようとしているため、問題が発生しています。私のコードは以下の通りです:

#Variables
advk = ['a','a','r','d','v','a','r','k']
textfile = []
number = 0
life = 0

for line in open('input.txt', 'rU'):
    textfile.append(line.rstrip().lower())


while life == 0:
    if all(word in textfile[number] for word in advk):
        printed = number + 1
        print ("Aardvark on line " + str(printed))
        number+=1
        if number == len(textfile):
            life+=1

    else:
        number+=1
4

3 に答える 3

8

Python で何かを数えたいときはいつでも、Counterクラスを念頭に置いてください。


from collections import Counter

advk = Counter(['a','a','r','d','v','a','r','k'])

with open('input.txt', 'rU') as file:
    for i, line in enumerate(file.readlines()):
        if not advk - Counter(line.lower()):
            print ("Aardvark on line " + str(i+1))

入力行が与えられた場合

dffdaardvarksdsda

カウンターは次のようになります

Counter({'d': 5, 'a': 4, 'f': 2, 's': 2, 'r': 2, 'k': 1, 'v': 1})

Counter({'a': 3, 'r': 2, 'd': 1, 'k': 1, 'v': 1})

検索する文字のリスト。

単純に 2 つのカウンターを差し引くというトリックを使用しadvl - Counter(line.lower())、結果のカウンターに要素が残っていないかどうかを確認します。


その他の注意事項:

withステートメントを使用して、ファイルを確実に閉じることができます。行番号を数える代わりに enumerate
を使用できます。

于 2012-08-07T07:21:03.123 に答える
-3
# If the line "ardvrk" should match, this is a solution:
chars=set('aardvark')
for nr, line in enumerate(open('input.txt', 'rU')):
    if not chars-set(line): # is subset?
        print 'match', nr, line,
于 2012-08-07T07:18:00.523 に答える
-3

advk リストが可変で、コンテンツが別の場所から読み取られる場合、リスト内の一意の要素を維持するために、それを設定およびチェックに変換できます。

advk = ['a','a','r','d','v','a','r','k']
advk = list(set(advk))

これにより、advk が一意のリストになり、行内の複数の 'a' のチェックが回避されます。

于 2012-08-07T06:57:14.877 に答える