2013-11-22 5 views
2

이 질문에 감사드립니다. 가 STR1에서 발생하는 모든 문자가 적어도 발생하면파이썬 3에서 부분 아나그램을 확인하는 방법

True을 반환하는 함수 부분 철자 바꾸기 (STR1, STR2)을 정의합니다

정말 특정 문제에 끼 었어, 나는 아래의 질문을 게시하여야한다 str2에 여러 번 입력합니다. 그렇지 않으면 False를 반환합니다.

(참고 :. str1과는 str2의 일부 철자 바꾸기 이유 인 str1이 발생하지 않는 str2에 추가 문자가있을 수 있습니다) [4마르크]

힌트 : 당신은에 str2를 변환하면 목록에서 str1의 문자를 루프하여 각각이 str2에 있는지 확인할 수 있습니다. 존재하지 않으면 str1은 str2의 부분 분석표가 될 수 없습니다 (따라서 False을 반환). 존재하는 경우 목록에서 해당 문자를 제거해야하며 (사용되지 않았기 때문에) 루핑을 계속 수행해야합니다. str1의 모든 문자와 always와 str2의 일치를 반복하면 True를 반환 할 수 있습니다.

def partial_anagram(str1,str2): 
    str2_list = list(str2) 
    for char in str1: 
     if char in str2_list: 
      str2_list.remove(char) 
      return True 
     else: 
      return False 
+0

왜 for 루프 내에'return str2_list'가 있습니까? 요구 사항에 따르면 '참'또는 '거짓'만 반환해야합니다. – Kevin

+0

이것은 흥미로운 문제인 것처럼 보이지만이 함수의 용도는 무엇입니까? –

답변

0

유일한 오류가 함수의 조기 반환 것 같다 :

내 코드입니다. 힌트return 명세서를 발행하여 then carry on looping을 제안하지만 기능을 종료하면 True을 반환합니다. 약간 수정 된 코드가 내게 맞는 것 같습니다 :

그러나 나는 당신의 과제에 대한 힌트와 제안 된 해결책을 정말 좋아하지 않습니다.

>>> from collections import Counter 
>>> def partial_anagram(str1, str2): 
...  return not bool(Counter(str1)-Counter(str2)) 
... 
>>> partial_anagram('abc', 'abc') 
True 
>>> partial_anagram('abc', 'cba') 
True 
>>> partial_anagram('abc', 'cb') 
False 
>>> partial_anagram('abac', 'cba') 
False 
>>> partial_anagram('abac', 'acbad') 
True 
>>> 

참고 위의 솔루션은을 사용 : 내가 제대로 이해하면

from collections import Counter 

def partial_anagram_counter(a, b): 
    if Counter(a) - Counter(b): 
     return False 
    return True 

>>> partial_anagram_counter('abacaba','aabbaaccaabbaa') 
True 
>>> partial_anagram('abacaba','aabbaaccaabbaa') 
True 
0

가, 다음이 당신이 원하는해야한다 : 나를 위해, 나는이 작업을 다른 방법으로 해결할 것 collections.Counter으로 알려진 특수 도구. 이 클래스를 사용할 수 없습니다 경우, 당신은이 작업을 수행 할 수 있습니다

>>> def partial_anagram(str1, str2): 
...  return all(str2.count(x) >= str1.count(x) for x in set(str1)) 
0

는이 같은 일이 충분할 것이라고 생각 :이 목록을 생성

def partial_anagram(str1, str2): 
    return not False in [str1.count(x) <= str2.count(x) for x in str1] 

즉, 각 문자가 str1 인 경우, str2에 적어도 str1 문자가 포함되는지 여부를 나타내는 부울입니다. 해당 목록에 False이 표시되면 str2보다 더 많은 문자가 str1에 하나 이상 나타납니다.

각 중복 문자를 확인하지 않아도 조금 더 효율적일 수 있지만 문자열이 비교적 작 으면 효율면에서 이득은 추가 코드 가치가 없을 것입니다. @iCodez의 대답은 Counter 클래스를 통한 최적화를 사용하며 더 큰 문자열의 경우 더 효율적일 수 있습니다.

+0

'for x in set (str1)'을하면 중복 검사가 중단됩니다. – iCodez

+0

@iCodez 넵 - 여분의 사이클을 보낼 필요가 없다고 확신합니다 ... – twalberg

0

대신에 초기 값이 0 인 변수가있는 경우에는? 에 str2 문자가있는 루프의 경우이 변수를 증가시킬 수 있습니다.

결국 변수의 길이가 str1 인 경우 str2에는 str1의 모든 문자가 포함됩니다.

def partial_anagram(str1,str2): 
    b=0 
    str2_list = list(str2) 
    for char in str1: 
     if char in str2_list: 
      str2_list.remove(char) 
      b+=1 
    if b==len(str1): 
     return True 
    else: 
     return False 

전체 분석기도 확인할 수 있습니다. b이 길이가 str2이고 길이가 str1 인 경우 str1str2은 똑같은 문자를 가지므로 직접 작성해야합니다 (마지막 if 문에 and b==len(str2) 추가).

관련 문제