2017-05-20 2 views
1

저는 파이썬 할당 작업을하고 있습니다. 여기서 멈추었습니다.문자열의 부분 문자열 수를 계산합니다.

분명히 문자열 안에 주어진 하위 문자열의 수를 계산하는 코드를 작성해야합니다.

나는 그것이 옳았다 고 생각했다. 그리고 나는 여기에서 붙어있다. 내가 이것을 실행하면

def count(substr,theStr): 
    # your code here 
    num = 0 
    i = 0 
    while substr in theStr[i:]: 
     i = i + theStr.find(substr)+1 
     num = num + 1 

    return num 

substr = 'is' 
theStr = 'mississipi' 
print(count(substr,theStr)) 

, 나는 결과로 2을 얻을 것으로 기대 아니라, 내가 할 3 ...

참조, 같은 anabanana 다른 예는, 잘 작동하지만, 이 특정 예제에서는 오류가 계속 발생합니다. 내가 뭘 잘못했는지 모르겠다.

나를 도와주세요. 당신이 필요로하는 코드 변경이

답변

0

올바르게 그러나

i = i + theStr.find(substr)+1 

theStr의 시작부터 찾고 유지, 목표 문자열 theStr에 걸쳐 진행된다.

str.find(sub[, start[, end]])

반환 문자열 하위이 내 발견되는 문자열에서 가장 낮은 인덱스 :

str.find 방법은 검색을 제한하는 옵션 시작 인수를 받아 슬라이스 s[start:end]. 선택 인수 시작 은 슬라이스 표기법으로 해석됩니다.하위을 찾을 수없는 경우 -1을 반환합니다.

여기서 in을 실제로 사용할 필요는 없습니다. find이 -1을 반환하지 않는지 확인할 수 있습니다. 서브 문자열 인덱스를 얻으려면 find을 사용하여 검색을 반복해야 할 때 in 검색을 수행하는 것이 약간의 낭비입니다.

str.count 메서드는 겹치지 않는 일치 항목을 찾을 수 있으므로 C에서 구현되었으므로 Python으로 직접 구현하는 것보다 효율적입니다.

def count(substr, theStr): 
    num = i = 0 
    while True: 
     j = theStr.find(substr, i) 
     if j == -1: 
      break 
     num += 1 
     i = j + 1 
    return num 

print(count('is', 'mississipi')) 
print(count('ana', 'bananana')) 

출력 코드의 핵심은

j = theStr.find(substr, i) 

i

0으로 초기화되므로, 우리 theStr의 처음부터 검색을 시작하고, 때문에 i = j + 1이다

2 
3 

후속 검색은 마지막으로 발견 된 일치 항목 다음의 색인을 검색합니다.

0

- 문자열은 항상 i까지 발견 대신 코드에서

i = i + theStr.find(substr)+ 1 

i = i + theStr[i:].find(substr)+ 1 

위치 4 개 이상에 도달합니다. 문자열의 인덱스를 찾는 동안 i 반복 첫째 그래서 2이 된 후, 당신은 다음 반복 str[i:]에 차례로 banana 당신의 예 1.

로 위치를 반환 원본 (전체) 문자열을 사용했다 nana이됩니다. 그리고이 슬라이스 된 문자열에서 부분 문자열 ana의 위치와 원래 문자열은 1입니다. 따라서 코드의 버그는 그냥 억제되고 코드는 제대로 작동하는 것 같습니다.

코드가 학습 목적으로 사용 된 경우이 방법을 사용할 수 있습니다. 그렇지 않으면 파이썬 제공 함수 (예 : count())를 사용하여 작업을 수행 할 수 있습니다. 코드

while substr in theStr[i:]: 

에서

0
def count(substr,theStr): 
    num = 0 
    for i in range(len(theStr)): 
     if theStr[i:i+len(substr)] == substr: 
      num += 1 
    return num 

substr = 'is' 
theStr = 'mississipi' 
print(count(substr,theStr)) 
+3

** 검토 대기열에서 : ** 답변에 대해 더 많은 상황을 추가하도록 요청할 수 있습니다. 코드 전용 답변은 이해하기 어렵습니다. 그것은 당신이 당신의 포스트에있는 정보를 더 추가 할 수있는 경우에 둘 다 구경꾼 및 미래 독자를 도울 것이다. –

관련 문제