0

私の意図は、プログラムに 3 セットの 2 文字を含むすべての文字列をテキスト ファイルにリストさせることです。3 つ以上の 2 文字セットが見つかった場合に True を返す関数は次のとおりです。

def three_double(s):
doubnum = 0
i=0
while i < len(s)-1:
    if s[i] == s[i+1]:
        doubnum += 1
    elif doubnum >= 3:
        return True
    else:
        i += 1
return False

なぜ何も印刷されないのかわかりません。これが残りのプログラムです。

# Function to read and apply the three_double test to each string in
# an input file.  It counts the number of results.
def find_three_double(fin):
    count = 0
    for w in fin:
        w = w.strip()
        if three_double(w):
            print w
            count = count + 1
    if count == 0:
        print '<None found>'
    else:
        print count, 'found'

# Bring in a package to access files over the web
import urllib

# Access the file containing the valid letters
words_url = "http://thinkpython.com/code/words.txt"
words_file = urllib.urlopen(words_url)

# Apply the actual test
find_three_double(words_file)
4

3 に答える 3

2

最初はあなたのコードを注意深く読んでいませんでしたが、それは関係がないread()readlines()、機能を繰り返していることがわかりましたfind_three_doubles()


あなたのthree_double()機能では:

while i < len(s)-1:
    if s[i] == s[i+1]:
        doubnum += 1
    elif doubnum >= 3:
        return True
    else:
        i += 1
return False

2 つの問題があります。

  • 1ずつインクリメントする必要がありますi。そうしないと、「ダブル」がある場合、whileループが停止しません。
  • elifここにも変更する必要がありifます。そうしないと、一部の修飾語が選択されないためです。

固定コード:

def three_double(s):
    doubnum = 0
    i=0
    while i < len(s)-1:
        if s[i] == s[i+1]:
            doubnum += 1
        if doubnum >= 3:
            return True
        i += 1
    return False


# Function to read and apply the three_double test to each string in
# an input file.  It counts the number of results.
def find_three_double(fin):
    count = 0
    for w in fin:
        w = w.strip()
        if three_double(w):
            print w
            count = count + 1
    if count == 0:
        print '<None found>'
    else:
        print count, 'found'

# Bring in a package to access files over the web
import urllib

# Access the file containing the valid letters
words_url = "http://thinkpython.com/code/words.txt"
words_file = urllib.urlopen(words_url)

# Apply the actual test
find_three_double(words_file)

結果:

aggressiveness
aggressivenesses
allottee
allottees
appellee
appellees
barrenness
barrennesses
bookkeeper
bookkeepers
bookkeeping
bookkeepings
cheerlessness
cheerlessnesses
committee
committees
greenness
greennesses
heedlessness
heedlessnesses
heelless
hyperaggressiveness
hyperaggressivenesses
keelless
keenness
keennesses
masslessness
masslessnesses
possessiveness
possessivenesses
rottenness
rottennesses
sleeplessness
stubbornness
stubbornnesses
successfully
suddenness
suddennesses
sullenness
sullennesses
toolless
wheelless
whippoorwill
whippoorwills
woodenness
woodennesses
46 found
于 2012-10-23T01:26:29.337 に答える
1

itertools.groupbyプログラムを大幅に簡素化できます (= バグが少なくなります)

from itertools import groupby
import urllib

def find_three_double(words_file):
    for word in words_file:
        word = word.strip()
        if sum(sum(1 for i in g) == 2 for k,g in groupby(word)) == 3:
            print word

# Access the file containing the valid letters
words_url = "http://thinkpython.com/code/words.txt"
words_file = urllib.urlopen(words_url)

# Apply the actual test
find_three_double(words_file)

説明:

ジェネレーター式の中に が表示されますgroupby(word)。これにより、単語がスキャンされ、2 つの文字がまとめられます。

sum(1 for i in g)グループごとに適用されます。これは、グループの長さを見つけることと同じです。長さが 2 の場合、これは 2 文字であるため、次のようにsum(1 for i in g) == 2評価されます。True

外側はとsum()のすべての値を合計し、として追加され、として追加されます。ちょうど 3 つの値がある場合、その単語は出力されます。TrueFalseTrue1False0True

于 2012-10-23T03:31:49.313 に答える
0
while i < len(s)-1:
    if s[i] == s[i+1]:
        doubnum += 1
    elif doubnum >= 3:
        return True
    else:
        i += 1

最初のチェック(s[i] == s[i+1])がTrueである場合、増分することはないiため、ループは永久に継続します。

于 2012-10-23T01:48:08.340 に答える