1

私は自分の好奇心の一部として自分でPythonを学んでいると言って、この前置きをさせてください。また、公開されている無料のオンラインコンピュータサイエンスコースを勧められたので、用語を間違って使用している場合はお詫びします。

私は以前にこの特定の問題に関する質問を見たことがありますが、それらとは別の質問があり、それらのスレッドをハイジャックしたくありませんでした。質問:

「サブストリングは、別のストリング内の文字の連続したシーケンスです。同じサブストリングは、同じストリング内で複数回発生する可能性があります。たとえば、「assesses」にはサブストリング「sses」が2回あり、「trans-Panamanianbanana」にはサブストリングがあります。 「6回。2行の入力を受け取るプログラムを作成します。最初の針と2番目の干し草の山を呼び出します。その針が干し草の山の部分文字列として出現する回数を出力します。」

私の解決策(これは機能します)は次のとおりです:

first = str(input())
second = str(input())

count = 0
location = 0
while location < len(second):
   if location == 0:
      location = str.find(second,first,0)
      if location < 0:
         break
      count = count + 1                          
   location = str.find(second,first,location +1)   
   if location < 0:
      break
   count = count + 1
print(count)

お気づきの方もいらっしゃると思いますが、私は2つの別々の機会に、場所が0未満の場合は中断するというifステートメントを作成しました。これを「グローバル」条件にして、繰り返しコードがないようにする方法はありますか?プログラムの高度化に伴い効率が最優先されると思いますので、今は良い練習をしようとしています。

Pythonの達人はこのコードをどのように最適化するのでしょうか、それとも私はあまりにも気まぐれですか?

4

7 に答える 7

4

マシューとダルシャンが最善の解決策だと思います。私はあなたの解決策に基づいたバリエーションを投稿します:

first = str(input())
second = str(input())  

def count_needle(first, second):

        location = str.find(second,first)
        if location == -1:
                return 0 # none whatsoever
        else:
                count = 1
                while location < len(second):
                   location = str.find(second,first,location +1)   
                   if location < 0:
                      break
                   count = count + 1
        return count

print(count_needle(first, second))

アイディア:

  • 必要に応じて関数を使用してコードを構造化する
  • locationwhileループに入る前に変数を初期化すると、位置<0を複数回チェックする必要がなくなります。
于 2012-07-29T06:55:50.633 に答える
3

正規表現、Pythonのreモジュール(http://docs.python.org/library/re.html)を確認してください。例えば、

import re
first = str(input())
second = str(input())
regex = first[:-1] + '(?=' + first[-1] + ')'
print(len(re.findall(regex, second)))
于 2012-07-29T06:24:44.490 に答える
0

Matthew Adamsが述べたように、それを行う最良の方法はpython'd re module Pythonremoduleを使用することです

あなたの場合、解決策は次のようになります。

import re

def find_needle_in_heystack(needle, heystack):
  return len(re.findall(needle, heystack))

Pythonを学んでいるので、「DRY」[Do n'tRepeatYourself]のマントラを使用するのが最善の方法です。多くの同様の状況で使用できるPythonユーティリティがたくさんあります。

いくつかの非常に重要なPythonモジュールの概要については、次のクラスを受講できます。

GooglePythonクラス

1日しかかからないはずです。

于 2012-07-29T06:43:56.677 に答える
0

あなたのアプローチでさえも単純化することができます(これは、存在しないオフセットから検索するように求めている間、findが-1を返すという事実を使用します):

>>> x = 'xoxoxo'
>>> start = x.find('o')
>>> indexes = []
>>> while start > -1:
...     indexes.append(start)
...     start = x.find('o',start+1)
>>> indexes
[1, 3, 5]
于 2012-07-29T06:51:49.100 に答える
0
needle = "ss"
haystack = "ssi lass 2 vecess estan ss."

print 'needle occurs %d times in haystack.' % haystack.count(needle)
于 2012-07-29T22:14:24.380 に答える
0

どうぞ :

first = str(input())
second = str(input())
x=len(first)
counter=0
for i in range(0,len(second)):
   if first==second[i:(x+i)]:
      counter=counter+1
print(counter)
于 2012-08-24T10:04:10.233 に答える
0

答え

needle=input()
haystack=input()
counter=0
for i in range(0,len(haystack)):
  if(haystack[i:len(needle)+i]!=needle):
     continue
  counter=counter+1
print(counter)
于 2013-05-18T03:21:53.263 に答える